diff mbox series

[07/44] hw/misc/iotkit-secctl.c: Implement SSE-300 PID register values

Message ID 20210219144617.4782-8-peter.maydell@linaro.org (mailing list archive)
State New, archived
Headers show
Series hw/arm: New board model mps3-an547 | expand

Commit Message

Peter Maydell Feb. 19, 2021, 2:45 p.m. UTC
The versions of the Secure Access Configuration Register Block
and Non-secure Access Configuration Register Block in the SSE-300
are the same as those in the SSE-200, but the CIDR/PIDR ID
register values are different.

Plumb through the sse-version property and use it to select
the correct ID register values.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 include/hw/misc/iotkit-secctl.h |  2 ++
 hw/arm/armsse.c                 |  2 ++
 hw/misc/iotkit-secctl.c         | 50 +++++++++++++++++++++++++++++++--
 3 files changed, 52 insertions(+), 2 deletions(-)

Comments

Richard Henderson March 4, 2021, 5:29 p.m. UTC | #1
On 2/19/21 6:45 AM, Peter Maydell wrote:
> The versions of the Secure Access Configuration Register Block
> and Non-secure Access Configuration Register Block in the SSE-300
> are the same as those in the SSE-200, but the CIDR/PIDR ID
> register values are different.
> 
> Plumb through the sse-version property and use it to select
> the correct ID register values.
> 
> Signed-off-by: Peter Maydell<peter.maydell@linaro.org>
> ---
>   include/hw/misc/iotkit-secctl.h |  2 ++
>   hw/arm/armsse.c                 |  2 ++
>   hw/misc/iotkit-secctl.c         | 50 +++++++++++++++++++++++++++++++--
>   3 files changed, 52 insertions(+), 2 deletions(-)

Which document am I looking for here?  I found DAI 0547B "Application Note 
AN547", but I don't see these register definitions.

Apart from validating the constant values, the actual code looks good.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~
Richard Henderson March 4, 2021, 5:51 p.m. UTC | #2
On 3/4/21 9:29 AM, Richard Henderson wrote:
> On 2/19/21 6:45 AM, Peter Maydell wrote:
>> The versions of the Secure Access Configuration Register Block
>> and Non-secure Access Configuration Register Block in the SSE-300
>> are the same as those in the SSE-200, but the CIDR/PIDR ID
>> register values are different.
>>
>> Plumb through the sse-version property and use it to select
>> the correct ID register values.
>>
>> Signed-off-by: Peter Maydell<peter.maydell@linaro.org>
>> ---
>>   include/hw/misc/iotkit-secctl.h |  2 ++
>>   hw/arm/armsse.c                 |  2 ++
>>   hw/misc/iotkit-secctl.c         | 50 +++++++++++++++++++++++++++++++--
>>   3 files changed, 52 insertions(+), 2 deletions(-)
> 
> Which document am I looking for here?  I found DAI 0547B "Application Note 
> AN547", but I don't see these register definitions.

I finally found the sse-300 subsystem trm: 101773_0000_02_en.

r~
Peter Maydell March 4, 2021, 7:28 p.m. UTC | #3
On Thu, 4 Mar 2021 at 17:51, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> On 3/4/21 9:29 AM, Richard Henderson wrote:
> > On 2/19/21 6:45 AM, Peter Maydell wrote:
> >> The versions of the Secure Access Configuration Register Block
> >> and Non-secure Access Configuration Register Block in the SSE-300
> >> are the same as those in the SSE-200, but the CIDR/PIDR ID
> >> register values are different.
> >>
> >> Plumb through the sse-version property and use it to select
> >> the correct ID register values.
> >>
> >> Signed-off-by: Peter Maydell<peter.maydell@linaro.org>
> >> ---
> >>   include/hw/misc/iotkit-secctl.h |  2 ++
> >>   hw/arm/armsse.c                 |  2 ++
> >>   hw/misc/iotkit-secctl.c         | 50 +++++++++++++++++++++++++++++++--
> >>   3 files changed, 52 insertions(+), 2 deletions(-)
> >
> > Which document am I looking for here?  I found DAI 0547B "Application Note
> > AN547", but I don't see these register definitions.
>
> I finally found the sse-300 subsystem trm: 101773_0000_02_en.

https://developer.arm.com/documentation/101773/latest/

The URL does turn up in this patchset, but not til patch 42 :-/

thanks
-- PMM
diff mbox series

Patch

diff --git a/include/hw/misc/iotkit-secctl.h b/include/hw/misc/iotkit-secctl.h
index 227d44abe49..79a36283201 100644
--- a/include/hw/misc/iotkit-secctl.h
+++ b/include/hw/misc/iotkit-secctl.h
@@ -120,6 +120,8 @@  struct IoTKitSecCtl {
     IoTKitSecCtlPPC apb[IOTS_NUM_APB_PPC];
     IoTKitSecCtlPPC apbexp[IOTS_NUM_APB_EXP_PPC];
     IoTKitSecCtlPPC ahbexp[IOTS_NUM_APB_EXP_PPC];
+
+    uint32_t sse_version;
 };
 
 #endif
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
index f509f59d4a8..9632c287351 100644
--- a/hw/arm/armsse.c
+++ b/hw/arm/armsse.c
@@ -654,6 +654,8 @@  static void armsse_realize(DeviceState *dev, Error **errp)
     }
 
     /* Security controller */
+    object_property_set_int(OBJECT(&s->secctl), "sse-version",
+                            info->sse_version, &error_abort);
     if (!sysbus_realize(SYS_BUS_DEVICE(&s->secctl), errp)) {
         return;
     }
diff --git a/hw/misc/iotkit-secctl.c b/hw/misc/iotkit-secctl.c
index 9fdb82056a8..7b41cfa8fc5 100644
--- a/hw/misc/iotkit-secctl.c
+++ b/hw/misc/iotkit-secctl.c
@@ -19,6 +19,8 @@ 
 #include "hw/registerfields.h"
 #include "hw/irq.h"
 #include "hw/misc/iotkit-secctl.h"
+#include "hw/arm/armsse-version.h"
+#include "hw/qdev-properties.h"
 
 /* Registers in the secure privilege control block */
 REG32(SECRESPCFG, 0x10)
@@ -95,6 +97,19 @@  static const uint8_t iotkit_secctl_ns_idregs[] = {
     0x0d, 0xf0, 0x05, 0xb1,
 };
 
+static const uint8_t iotkit_secctl_s_sse300_idregs[] = {
+    0x04, 0x00, 0x00, 0x00,
+    0x52, 0xb8, 0x2b, 0x00,
+    0x0d, 0xf0, 0x05, 0xb1,
+};
+
+static const uint8_t iotkit_secctl_ns_sse300_idregs[] = {
+    0x04, 0x00, 0x00, 0x00,
+    0x53, 0xb8, 0x2b, 0x00,
+    0x0d, 0xf0, 0x05, 0xb1,
+};
+
+
 /* The register sets for the various PPCs (AHB internal, APB internal,
  * AHB expansion, APB expansion) are all set up so that they are
  * in 16-aligned blocks so offsets 0xN0, 0xN4, 0xN8, 0xNC are PPCs
@@ -213,7 +228,14 @@  static MemTxResult iotkit_secctl_s_read(void *opaque, hwaddr addr,
     case A_CID1:
     case A_CID2:
     case A_CID3:
-        r = iotkit_secctl_s_idregs[(offset - A_PID4) / 4];
+        switch (s->sse_version) {
+        case ARMSSE_SSE300:
+            r = iotkit_secctl_s_sse300_idregs[(offset - A_PID4) / 4];
+            break;
+        default:
+            r = iotkit_secctl_s_idregs[(offset - A_PID4) / 4];
+            break;
+        }
         break;
     case A_SECPPCINTCLR:
     case A_SECMSCINTCLR:
@@ -473,7 +495,14 @@  static MemTxResult iotkit_secctl_ns_read(void *opaque, hwaddr addr,
     case A_CID1:
     case A_CID2:
     case A_CID3:
-        r = iotkit_secctl_ns_idregs[(offset - A_PID4) / 4];
+        switch (s->sse_version) {
+        case ARMSSE_SSE300:
+            r = iotkit_secctl_ns_sse300_idregs[(offset - A_PID4) / 4];
+            break;
+        default:
+            r = iotkit_secctl_ns_idregs[(offset - A_PID4) / 4];
+            break;
+        }
         break;
     default:
         qemu_log_mask(LOG_GUEST_ERROR,
@@ -710,6 +739,16 @@  static void iotkit_secctl_init(Object *obj)
     sysbus_init_mmio(sbd, &s->ns_regs);
 }
 
+static void iotkit_secctl_realize(DeviceState *dev, Error **errp)
+{
+    IoTKitSecCtl *s = IOTKIT_SECCTL(dev);
+
+    if (!armsse_version_valid(s->sse_version)) {
+        error_setg(errp, "invalid sse-version value %d", s->sse_version);
+        return;
+    }
+}
+
 static const VMStateDescription iotkit_secctl_ppc_vmstate = {
     .name = "iotkit-secctl-ppc",
     .version_id = 1,
@@ -775,12 +814,19 @@  static const VMStateDescription iotkit_secctl_vmstate = {
     },
 };
 
+static Property iotkit_secctl_props[] = {
+    DEFINE_PROP_UINT32("sse-version", IoTKitSecCtl, sse_version, 0),
+    DEFINE_PROP_END_OF_LIST()
+};
+
 static void iotkit_secctl_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->vmsd = &iotkit_secctl_vmstate;
     dc->reset = iotkit_secctl_reset;
+    dc->realize = iotkit_secctl_realize;
+    device_class_set_props(dc, iotkit_secctl_props);
 }
 
 static const TypeInfo iotkit_secctl_info = {