[PATCH 2/2] cmd/sbi: add missing SBI information

Sean Anderson seanga2 at gmail.com
Tue Jul 20 07:13:56 CEST 2021


On 7/20/21 12:59 AM, Heinrich Schuchardt wrote:
> Am 20. Juli 2021 03:11:34 MESZ schrieb Sean Anderson <seanga2 at gmail.com>:
>> On 7/19/21 4:28 PM, Heinrich Schuchardt wrote:
>>> Let the sbi command display:
>>>
>>> * SBI implementation version
>>> * machine vendor ID
>>> * machine architecture ID
>>> * machine implementation ID
>>>
>>> With this patch the output for the HiFive Unmatched looks like
>>>
>>>       => sbi
>>>       SBI 0.3
>>>       OpenSBI 0.9
>>>       Machine:
>>>         Vendor ID 489
>>>         Architecture ID 8000000000000007
>>>         Implementation ID 20181004
>>>       Extensions:
>>>         sbi_set_timer
>>>         sbi_console_putchar
>>>         sbi_console_getchar
>>>         sbi_clear_ipi
>>>         sbi_send_ipi
>>>         sbi_remote_fence_i
>>>         sbi_remote_sfence_vma
>>>         sbi_remote_sfence_vma_asid
>>>         sbi_shutdown
>>>         SBI Base Functionality
>>>         Timer Extension
>>>         IPI Extension
>>>         RFENCE Extension
>>>         Hart State Management Extension
>>>         System Reset Extension
>>>
>>> Signed-off-by: Heinrich Schuchardt
>> <heinrich.schuchardt at canonical.com>
>>> ---
>>>    cmd/riscv/sbi.c | 19 ++++++++++++++++++-
>>>    1 file changed, 18 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/cmd/riscv/sbi.c b/cmd/riscv/sbi.c
>>> index 90c0811e14..c0db763ba7 100644
>>> --- a/cmd/riscv/sbi.c
>>> +++ b/cmd/riscv/sbi.c
>>> @@ -59,13 +59,30 @@ static int do_sbi(struct cmd_tbl *cmdtp, int
>> flag, int argc,
>>>    	if (ret >= 0) {
>>>    		for (i = 0; i < ARRAY_SIZE(implementations); ++i) {
>>>    			if (ret == implementations[i].id) {
>>> -				printf("%s\n", implementations[i].name);
>>> +				printf("%s", implementations[i].name);
>>> +				ret = sbi_get_impl_version();
>>> +				if (ret > 0) {
>>
>> Shouldn't this have to check to ensure that i == 1?
> 
> Other SBI implementions may also provide a version number. I did not analyze how the should be formatted.

Right, so shouldn't we default to the raw hex string?

> 
>>
>>> +					/* OpenSBI specific version encoding */
>>> +					printf(" %ld", ret >> 16);
>>> +					printf(".%ld", ret & 0xffff);
>>> +				}
>>> +				printf("\n");
>>>    				break;
>>>    			}
>>>    		}
>>>    		if (i == ARRAY_SIZE(implementations))
>>>    			printf("Unknown implementation ID %ld\n", ret);
>>>    	}
>>> +	printf("Machine:\n");
>>> +	ret = sbi_get_mvendorid();
>>> +	if (ret != -ENOTSUPP)
> 
> Should we use an unsigned int as return value and 0 to indicate a missing implementation? mvendorid is only 32 bits wide.
> 
>>> +		printf("  Vendor ID %lx\n", ret);
>>
>> perhaps %0.8lx? And should we decode the JEDEC id?
> 
> Leading zeros won't add any meaning here. Splitting into the 25 bit and 7 bit subfields could be reasonable.

I think this would be a good option.

> Decoding could result in up to 2^26 digits. I don't want to wait for all of these on my serial console.

Well, they're only up to 12 continuation codes, so imposing a small maximum would likely not be too onerous.

--Sean


More information about the U-Boot mailing list