public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Pete Batard" <pete@akeo.ie>
To: Leif Lindholm <leif.lindholm@linaro.org>
Cc: devel@edk2.groups.io, ard.biesheuvel@linaro.org
Subject: Re: [edk2-platforms][PATCH v2 1/5] Platform/RPi3/RpiFirmwareDxe: Add more query functions
Date: Thu, 10 Oct 2019 13:41:06 +0100	[thread overview]
Message-ID: <b10e7d5c-7298-dc70-19dd-47f5d477d0e9@akeo.ie> (raw)
In-Reply-To: <20191010083948.GS25504@bivouac.eciton.net>

Hi Leif,

On 2019.10.10 09:39, Leif Lindholm wrote:
> On Tue, Oct 08, 2019 at 01:38:37PM +0100, Pete Batard wrote:
>> This patch introduces the capability to also query the Model Name/
>> Manufacturer Name/CPU Name/Firmware Revision using the RpiFirmware
>> protocol. This is aims at making the driver more suitable to cater
>> for platforms other than the Raspberry Pi 3 as well as simplifying
>> the population of entries in PlatformSmbiosDxe.
>>
>> Signed-off-by: Pete Batard <pete@akeo.ie>
>> ---
>>   Platform/RaspberryPi/RPi3/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c | 155 +++++++++++++++++++-
>>   Platform/RaspberryPi/RPi3/Include/Protocol/RpiFirmware.h          |  58 ++++++--
>>   2 files changed, 196 insertions(+), 17 deletions(-)
>>
>> diff --git a/Platform/RaspberryPi/RPi3/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c b/Platform/RaspberryPi/RPi3/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c
>> index 9b5ee1946279..378c99bcba05 100644
>> --- a/Platform/RaspberryPi/RPi3/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c
>> +++ b/Platform/RaspberryPi/RPi3/Drivers/RpiFirmwareDxe/RpiFirmwareDxe.c
>> @@ -461,7 +461,7 @@ typedef struct {
>>     RPI_FW_TAG_HEAD           TagHead;
>>     RPI_FW_MODEL_REVISION_TAG TagBody;
>>     UINT32                    EndTag;
>> -} RPI_FW_GET_MODEL_REVISION_CMD;
>> +} RPI_FW_GET_REVISION_CMD;
>>   #pragma pack()
>>   
>>   STATIC
>> @@ -471,7 +471,7 @@ RpiFirmwareGetModelRevision (
>>     OUT   UINT32 *Revision
>>     )
>>   {
>> -  RPI_FW_GET_MODEL_REVISION_CMD *Cmd;
>> +  RPI_FW_GET_REVISION_CMD       *Cmd;
>>     EFI_STATUS                    Status;
>>     UINT32                        Result;
>>   
>> @@ -506,6 +506,153 @@ RpiFirmwareGetModelRevision (
>>     return EFI_SUCCESS;
>>   }
>>   
>> +STATIC
>> +EFI_STATUS
>> +EFIAPI
>> +RpiFirmwareGetFirmwareRevision (
>> +  OUT   UINT32 *Revision
>> +  )
>> +{
>> +  RPI_FW_GET_REVISION_CMD       *Cmd;
>> +  EFI_STATUS                    Status;
>> +  UINT32                        Result;
>> +
>> +  if (!AcquireSpinLockOrFail (&mMailboxLock)) {
>> +    DEBUG ((DEBUG_ERROR, "%a: failed to acquire spinlock\n", __FUNCTION__));
>> +    return EFI_DEVICE_ERROR;
>> +  }
>> +
>> +  Cmd = mDmaBuffer;
>> +  ZeroMem (Cmd, sizeof (*Cmd));
>> +
>> +  Cmd->BufferHead.BufferSize  = sizeof (*Cmd);
>> +  Cmd->BufferHead.Response    = 0;
>> +  Cmd->TagHead.TagId          = RPI_MBOX_GET_REVISION;
>> +  Cmd->TagHead.TagSize        = sizeof (Cmd->TagBody);
>> +  Cmd->TagHead.TagValueSize   = 0;
>> +  Cmd->EndTag                 = 0;
>> +
>> +  Status = MailboxTransaction (Cmd->BufferHead.BufferSize, RPI_MBOX_VC_CHANNEL, &Result);
>> +
>> +  ReleaseSpinLock (&mMailboxLock);
>> +
>> +  if (EFI_ERROR (Status) ||
>> +      Cmd->BufferHead.Response != RPI_MBOX_RESP_SUCCESS) {
>> +    DEBUG ((DEBUG_ERROR,
>> +      "%a: mailbox transaction error: Status == %r, Response == 0x%x\n",
>> +      __FUNCTION__, Status, Cmd->BufferHead.Response));
>> +    return EFI_DEVICE_ERROR;
>> +  }
>> +
>> +  *Revision = Cmd->TagBody.Revision;
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +STATIC
>> +CHAR8*
>> +EFIAPI
>> +RpiFirmwareGetModelName (
>> +  IN INTN ModelId
>> +  )
>> +{
>> +  UINT32  Revision;
>> +
>> +  // If a negative ModelId is passed, detect it.
>> +  if ((ModelId < 0) && (RpiFirmwareGetModelRevision (&Revision) == EFI_SUCCESS))
> 
> Style-wise, please always use {} with if-statements.

Will do.

> Beyond that, this pattern repeats identcally in three functions in
> this file. Meanwhile, there is never any error handling of
> RpiFirmwareGetModelRevision other than if not successful, we leave it
> as negative.

Yes, because then we'll get the default case (that returns "Unknown 
..."), which is precisely what we want if we can't access the model 
revision for any reason.

> Are there other intended uses of that function, or could
> we move this logic there?

I'm not sure how that would work, since ModelId, ManufacturerId, and 
CpuId are for different parts of the bit fields, so, if I understand 
what you're suggesting correctly (but I'm not really sure I do) trying 
to move the check for negative value into RpiFirmwareGetModelRevision () 
wouldn't work that great. Plus then the function name would become a 
misnommer.

Are you really seeing a functional issue with the current code, or 
something that would make a possible contributor wanting to modify this 
section puzzled as to what we're trying to accomplish here (which I 
think is pretty clear, but then again, I wrote the code so maybe I'm not 
the most impartial? Because if not, I'd rather save my limited supply of 
time, and just go with a v3 that only adds the {} suggested.

Regards,

/Pete

> 
> /
>      Leif
> 
>> +    ModelId = (Revision >> 4) & 0xFF;
>> +
>> +  switch (ModelId) {
>> +  // www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
>> +  case 0x00:
>> +    return "Raspberry Pi Model A";
>> +  case 0x01:
>> +    return "Raspberry Pi Model B";
>> +  case 0x02:
>> +    return "Raspberry Pi Model A+";
>> +  case 0x03:
>> +    return "Raspberry Pi Model B+";
>> +  case 0x04:
>> +    return "Raspberry Pi 2 Model B";
>> +  case 0x06:
>> +    return "Raspberry Pi Compute Module 1";
>> +  case 0x08:
>> +    return "Raspberry Pi 3 Model B";
>> +  case 0x09:
>> +    return "Raspberry Pi Zero";
>> +  case 0x0A:
>> +    return "Raspberry Pi Compute Module 3";
>> +  case 0x0C:
>> +    return "Raspberry Pi Zero W";
>> +  case 0x0D:
>> +    return "Raspberry Pi 3 Model B+";
>> +  case 0x0E:
>> +    return "Raspberry Pi 3 Model A+";
>> +  case 0x11:
>> +    return "Raspberry Pi 4 Model B";
>> +  default:
>> +    return "Unknown Raspberry Pi Model";
>> +  }
>> +}
>> +
>> +STATIC
>> +CHAR8*
>> +EFIAPI
>> +RpiFirmwareGetManufacturerName (
>> +  IN INTN ManufacturerId
>> +  )
>> +{
>> +  UINT32  Revision;
>> +
>> +  // If a negative ModelId is passed, detect it.
>> +  if ((ManufacturerId < 0) && (RpiFirmwareGetModelRevision (&Revision) == EFI_SUCCESS))
>> +    ManufacturerId = (Revision >> 16) & 0x0F;
>> +
>> +  switch (ManufacturerId) {
>> +  // www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
>> +  case 0x00:
>> +    return "Sony UK";
>> +  case 0x01:
>> +    return "Egoman";
>> +  case 0x02:
>> +  case 0x04:
>> +    return "Embest";
>> +  case 0x03:
>> +    return "Sony Japan";
>> +  case 0x05:
>> +    return "Stadium";
>> +  default:
>> +    return "Unknown Manufacturer";
>> +  }
>> +}
>> +
>> +STATIC
>> +CHAR8*
>> +EFIAPI
>> +RpiFirmwareGetCpuName (
>> +  IN INTN CpuId
>> +  )
>> +{
>> +  UINT32  Revision;
>> +
>> +  // If a negative CpuId is passed, detect it.
>> +  if ((CpuId < 0) && (RpiFirmwareGetModelRevision (&Revision) == EFI_SUCCESS))
>> +    CpuId = (Revision >> 12) & 0x0F;
>> +
>> +  switch (CpuId) {
>> +  // www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md
>> +  case 0x00:
>> +    return "BCM2835 (ARM11)";
>> +  case 0x01:
>> +    return "BCM2836 (ARM Cortex-A7)";
>> +  case 0x02:
>> +    return "BCM2837 (ARM Cortex-A53)";
>> +  case 0x03:
>> +    return "BCM2711 (ARM Cortex-A72)";
>> +  default:
>> +    return "Unknown CPU Model";
>> +  }
>> +}
>> +
>>   #pragma pack()
>>   typedef struct {
>>     UINT32 Width;
>> @@ -1009,6 +1156,10 @@ STATIC RASPBERRY_PI_FIRMWARE_PROTOCOL mRpiFirmwareProtocol = {
>>     RpiFirmwareGetSerial,
>>     RpiFirmwareGetModel,
>>     RpiFirmwareGetModelRevision,
>> +  RpiFirmwareGetModelName,
>> +  RpiFirmwareGetFirmwareRevision,
>> +  RpiFirmwareGetManufacturerName,
>> +  RpiFirmwareGetCpuName,
>>     RpiFirmwareGetArmMemory
>>   };
>>   
>> diff --git a/Platform/RaspberryPi/RPi3/Include/Protocol/RpiFirmware.h b/Platform/RaspberryPi/RPi3/Include/Protocol/RpiFirmware.h
>> index ec70f28efe1a..e49d6e6132d9 100644
>> --- a/Platform/RaspberryPi/RPi3/Include/Protocol/RpiFirmware.h
>> +++ b/Platform/RaspberryPi/RPi3/Include/Protocol/RpiFirmware.h
>> @@ -96,6 +96,30 @@ EFI_STATUS
>>     UINT32 *Revision
>>     );
>>   
>> +typedef
>> +CHAR8*
>> +(EFIAPI *GET_MODEL_NAME) (
>> +  INTN ModelId
>> +  );
>> +
>> +typedef
>> +EFI_STATUS
>> +(EFIAPI *GET_FIRMWARE_REVISION) (
>> +  UINT32 *Revision
>> +  );
>> +
>> +typedef
>> +CHAR8*
>> +(EFIAPI *GET_MANUFACTURER_NAME) (
>> +  INTN ManufacturerId
>> +  );
>> +
>> +typedef
>> +CHAR8*
>> +(EFIAPI *GET_CPU_NAME) (
>> +  INTN CpuId
>> +  );
>> +
>>   typedef
>>   EFI_STATUS
>>   (EFIAPI *GET_ARM_MEM) (
>> @@ -104,21 +128,25 @@ EFI_STATUS
>>     );
>>   
>>   typedef struct {
>> -  SET_POWER_STATE    SetPowerState;
>> -  GET_MAC_ADDRESS    GetMacAddress;
>> -  GET_COMMAND_LINE   GetCommandLine;
>> -  GET_CLOCK_RATE     GetClockRate;
>> -  GET_CLOCK_RATE     GetMaxClockRate;
>> -  GET_CLOCK_RATE     GetMinClockRate;
>> -  SET_CLOCK_RATE     SetClockRate;
>> -  GET_FB             GetFB;
>> -  FREE_FB            FreeFB;
>> -  GET_FB_SIZE        GetFBSize;
>> -  SET_LED            SetLed;
>> -  GET_SERIAL         GetSerial;
>> -  GET_MODEL          GetModel;
>> -  GET_MODEL_REVISION GetModelRevision;
>> -  GET_ARM_MEM        GetArmMem;
>> +  SET_POWER_STATE       SetPowerState;
>> +  GET_MAC_ADDRESS       GetMacAddress;
>> +  GET_COMMAND_LINE      GetCommandLine;
>> +  GET_CLOCK_RATE        GetClockRate;
>> +  GET_CLOCK_RATE        GetMaxClockRate;
>> +  GET_CLOCK_RATE        GetMinClockRate;
>> +  SET_CLOCK_RATE        SetClockRate;
>> +  GET_FB                GetFB;
>> +  FREE_FB               FreeFB;
>> +  GET_FB_SIZE           GetFBSize;
>> +  SET_LED               SetLed;
>> +  GET_SERIAL            GetSerial;
>> +  GET_MODEL             GetModel;
>> +  GET_MODEL_REVISION    GetModelRevision;
>> +  GET_MODEL_NAME        GetModelName;
>> +  GET_FIRMWARE_REVISION GetFirmwareRevision;
>> +  GET_MANUFACTURER_NAME GetManufacturerName;
>> +  GET_CPU_NAME          GetCpuName;
>> +  GET_ARM_MEM           GetArmMem;
>>   } RASPBERRY_PI_FIRMWARE_PROTOCOL;
>>   
>>   extern EFI_GUID gRaspberryPiFirmwareProtocolGuid;
>> -- 
>> 2.21.0.windows.1
>>


  reply	other threads:[~2019-10-10 12:41 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-08 12:38 [edk2-platforms][PATCH v2 0/5] Platform/RPi3: Various SMBIOS improvements Pete Batard
2019-10-08 12:38 ` [edk2-platforms][PATCH v2 1/5] Platform/RPi3/RpiFirmwareDxe: Add more query functions Pete Batard
2019-10-10  8:39   ` Leif Lindholm
2019-10-10 12:41     ` Pete Batard [this message]
2019-10-10 16:43       ` Leif Lindholm
2019-10-10 17:27         ` Pete Batard
2019-10-08 12:38 ` [edk2-platforms][PATCH v2 2/5] Platform/RPi3/RpiFirmwareDxe: Improve serial number population Pete Batard
2019-10-10  8:43   ` Leif Lindholm
2019-10-10 12:41     ` Pete Batard
2019-10-10 16:49       ` Leif Lindholm
2019-10-10 17:28         ` Pete Batard
2019-10-08 12:38 ` [edk2-platforms][PATCH v2 3/5] Platform/RPi3/PlatformSmbiosDxe: Improve population of SMBIOS entries Pete Batard
2019-10-10  8:59   ` Leif Lindholm
2019-10-08 12:38 ` [edk2-platforms][PATCH v2 4/5] Platform/RPi3/PlatformSmbiosDxe: Populate BIOS major/minor from PCD Pete Batard
2019-10-10  9:01   ` Leif Lindholm
2019-10-08 12:38 ` [edk2-platforms][PATCH v2 5/5] Platform/RPi3/PlatformSmbiosDxe: Derive RAM size from board revision Pete Batard
2019-10-10  9:03   ` Leif Lindholm

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b10e7d5c-7298-dc70-19dd-47f5d477d0e9@akeo.ie \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox