[커널 18차] 72주차

2022.10.09 00:15

kkr 조회 수:175

gic 진행중

git : https://github.com/iamroot18/5.10/commit/505d9d66f08a07191eeae4e5fcf86d19f9819144

 

diff --git a/arch/arm64/include/asm/arch_gicv3.h b/arch/arm64/include/asm/arch_gicv3.h
index 4ad22c3135db..9b010ee29b42 100644
--- a/arch/arm64/include/asm/arch_gicv3.h
+++ b/arch/arm64/include/asm/arch_gicv3.h
@@ -147,6 +147,10 @@ static inline u32 gic_read_rpr(void)
 #define gicr_write_vpendbaser(v, c)    writeq_relaxed(v, c)
 #define gicr_read_vpendbaser(c)        readq_relaxed(c)
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - priority masking 지원여부 확인.
+ */
 static inline bool gic_prio_masking_enabled(void)
 {
     return system_uses_irq_prio_masking();
diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
index d3c97132b919..511428d49086 100644
--- a/arch/arm64/include/asm/cpufeature.h
+++ b/arch/arm64/include/asm/cpufeature.h
@@ -864,6 +864,7 @@ static inline bool system_has_full_ptr_auth(void)
 /*
  * IAMROOT, 2021.10.16:
  * - GIC NMI관련 함수
+ * - 우선순위 필터를 제어함으로 irq enalbe/disable을 결정할수있는지 확인한다.
  */
 static __always_inline bool system_uses_irq_prio_masking(void)
 {
diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h
index d5afa75014d2..1a9a26db58c8 100644
--- a/arch/arm64/include/asm/ptrace.h
+++ b/arch/arm64/include/asm/ptrace.h
@@ -47,6 +47,22 @@
 #define __GIC_PRIO_IRQOFF_NS        0xa0
 #define GIC_PRIO_PSR_I_SET        (1 << 4)
 
+
+/*
+ * IAMROOT, 2022.10.08:
+ * priority low
+ *               0xff
+ *               ..
+ * 0b1110_0000   0xe0 enable (0b1110_0000)
+ *               
+ * 0b1010_0000   0xa0 normal irq(GICD_INT_DEF_PRI)
+ *               
+ * 0b0110_0000   0x60 disable   
+ *               ..           ^
+ *               ..           | disalbe시 이쪽만 interrupt를 부분적으로 허용한다.
+ *               0x00         v
+ * priority high     
+ */
 #define GIC_PRIO_IRQOFF                            \
     ({                                \
         extern struct static_key_false gic_nonsecure_priorities;\
diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h
index ee6a8376c53d..fcb08da5b6e9 100644
--- a/arch/arm64/include/asm/sysreg.h
+++ b/arch/arm64/include/asm/sysreg.h
@@ -218,6 +218,10 @@
 #define SYS_SPSR_EL1            sys_reg(3, 0, 4, 0, 0)
 #define SYS_ELR_EL1            sys_reg(3, 0, 4, 0, 1)
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - Interrupt Controller Interrupt Priority Mask Register
+ */
 #define SYS_ICC_PMR_EL1            sys_reg(3, 0, 4, 6, 0)
 
 #define SYS_AFSR0_EL1            sys_reg(3, 0, 5, 1, 0)
diff --git a/drivers/irqchip/irq-gic-common.c b/drivers/irqchip/irq-gic-common.c
index 42ca5d389b18..f306e0ab46d0 100644
--- a/drivers/irqchip/irq-gic-common.c
+++ b/drivers/irqchip/irq-gic-common.c
@@ -100,6 +100,11 @@ int gic_configure_irq(unsigned int irq, unsigned int type,
     return ret;
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - v1 ~ v2는 이 함수만 호출하고, v3는 다른걸(extend register등) 설정하고
+ *   이걸 호출한다.
+ */
 void gic_dist_config(void __iomem *base, int gic_irqs,
              void (*sync_access)(void))
 {
@@ -108,6 +113,10 @@ void gic_dist_config(void __iomem *base, int gic_irqs,
     /*
      * Set all global interrupts to be level triggered, active low.
      */
+/*
+ * IAMROOT, 2022.10.08:
+ * - active low lvl trigger로 설정.
+ */
     for (i = 32; i < gic_irqs; i += 16)
         writel_relaxed(GICD_INT_ACTLOW_LVLTRIG,
                     base + GIC_DIST_CONFIG + i / 4);
@@ -133,6 +142,11 @@ void gic_dist_config(void __iomem *base, int gic_irqs,
         sync_access();
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - v1 ~ v2는 이 함수만 호출하고, v3는 다른걸(extend register등) 설정하고
+ *   이걸 호출한다.
+ */
 void gic_cpu_config(void __iomem *base, int nr, void (*sync_access)(void))
 {
     int i;
@@ -141,6 +155,10 @@ void gic_cpu_config(void __iomem *base, int nr, void (*sync_access)(void))
      * Deal with the banked PPI and SGI interrupts - disable all
      * private interrupts. Make sure everything is deactivated.
      */
+/*
+ * IAMROOT, 2022.10.08:
+ * - 끈다.
+ */
     for (i = 0; i < nr; i += 32) {
         writel_relaxed(GICD_INT_EN_CLR_X32,
                    base + GIC_DIST_ACTIVE_CLEAR + i / 8);
@@ -151,6 +169,10 @@ void gic_cpu_config(void __iomem *base, int nr, void (*sync_access)(void))
     /*
      * Set priority on PPI and SGI interrupts
      */
+/*
+ * IAMROOT, 2022.10.08:
+ * - 0xA0A0A0A0으로 설정한다.
+ */
     for (i = 0; i < nr; i += 4)
         writel_relaxed(GICD_INT_DEF_PRI_X4,
                     base + GIC_DIST_PRI + i * 4 / 4);
diff --git a/drivers/irqchip/irq-gic-v3-mbi.c b/drivers/irqchip/irq-gic-v3-mbi.c
index b84c9c2eccdc..c79033714ccc 100644
--- a/drivers/irqchip/irq-gic-v3-mbi.c
+++ b/drivers/irqchip/irq-gic-v3-mbi.c
@@ -260,6 +260,10 @@ static int mbi_allocate_domains(struct irq_domain *parent)
     return 0;
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - TODO
+ */
 int __init mbi_init(struct fwnode_handle *fwnode, struct irq_domain *parent)
 {
     struct device_node *np;
diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
index 5e373fc12db8..d9eebd1d9073 100644
--- a/drivers/irqchip/irq-gic-v3.c
+++ b/drivers/irqchip/irq-gic-v3.c
@@ -54,6 +54,11 @@ struct gic_chip_data {
     u32            nr_redist_regions;
     u64            flags;
     bool            has_rss;
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - __gic_update_rdist_properties() 참고
+ */
     unsigned int        ppi_nr;
     struct partition_desc    **ppi_descs;
 };
@@ -141,6 +146,10 @@ static DEFINE_PER_CPU(bool, has_rss);
 
 #define MPIDR_RS(mpidr)            (((mpidr) & 0xF0UL) >> 4)
 #define gic_data_rdist()        (this_cpu_ptr(gic_data.rdists.rdist))
+/*
+ * IAMROOT, 2022.10.08:
+ * - gic_populate_rdist()에서 설정된다.
+ */
 #define gic_data_rdist_rd_base()    (gic_data_rdist()->rd_base)
 /*
  * IAMROOT, 2022.10.01:
@@ -149,6 +158,10 @@ static DEFINE_PER_CPU(bool, has_rss);
 #define gic_data_rdist_sgi_base()    (gic_data_rdist_rd_base() + SZ_64K)
 
 /* Our default, arbitrary priority value. Linux only uses one anyway. */
+/*
+ * IAMROOT, 2022.10.08:
+ * - 모든 interrupt 허용.
+ */
 #define DEFAULT_PMR_VALUE    0xf0
 
 enum gic_intid_range {
@@ -280,6 +293,11 @@ static u64 __maybe_unused gic_read_iar(void)
 }
 #endif
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - @enable true이면 rdist에 연결된 cpu wakeup.
+ *           false이면 rdist에 연결된 cpu sleep.
+ */
 static void gic_enable_redist(bool enable)
 {
     void __iomem *rbase;
@@ -291,7 +309,16 @@ static void gic_enable_redist(bool enable)
 
     rbase = gic_data_rdist_rd_base();
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - 
+ */
     val = readl_relaxed(rbase + GICR_WAKER);
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - 저전력 상태를 막는다.
+ */
     if (enable)
         /* Wake up this CPU redistributor */
         val &= ~GICR_WAKER_ProcessorSleep;
@@ -299,6 +326,11 @@ static void gic_enable_redist(bool enable)
         val |= GICR_WAKER_ProcessorSleep;
     writel_relaxed(val, rbase + GICR_WAKER);
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - GICR_WAKER_ProcessorSleep를 set했는데도 불구하고 set이 안됫으면
+ *   No PM support라고 생각해서 그냥 빠져 나간다.
+ */
     if (!enable) {        /* Check that GICR_WAKER is writeable */
         val = readl_relaxed(rbase + GICR_WAKER);
         if (!(val & GICR_WAKER_ProcessorSleep))
@@ -307,11 +339,26 @@ static void gic_enable_redist(bool enable)
 
     while (--count) {
         val = readl_relaxed(rbase + GICR_WAKER);
+/*
+ * IAMROOT, 2022.10.08:
+ * - enable 1 -> GICR_WAKER_ProcessorSleep == 0. wakeup 요청
+ *   GICR_WAKER_ChildrenAsleep == 0이면 break.
+ *   (하나의 cpu라도 깨어있는 상태).
+ *
+ * - enable 0 -> GICR_WAKER_ProcessorSleep == 1. sleep 요청
+ *   GICR_WAKER_ChildrenAsleep == 1이면 break.
+ *   (모든 rdist에 연결된 cpu가 잠든상태.)
+ */
         if (enable ^ (bool)(val & GICR_WAKER_ChildrenAsleep))
             break;
         cpu_relax();
         udelay(1);
     }
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - timeout
+ */
     if (!count)
         pr_err_ratelimited("redistributor failed to %s...\n",
                    enable ? "wakeup" : "sleep");
@@ -465,12 +512,22 @@ static void gic_unmask_irq(struct irq_data *d)
     gic_poke_irq(d, GICD_ISENABLER);
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - nmi를 위해서 pmr로 제어 하는지에 대한 여부. arm에는 실제 nmi가 구현되있지 않아
+ *   pmr로 간접적으로 사용한다.
+ */
 static inline bool gic_supports_nmi(void)
 {
     return IS_ENABLED(CONFIG_ARM64_PSEUDO_NMI) &&
            static_branch_likely(&supports_pseudo_nmis);
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - IRQCHIP_STATE_PENDING
+ *   irq_retrigger(gic_retrigger). GICD_ISPENDR bit set.
+ */
 static int gic_irq_set_irqchip_state(struct irq_data *d,
                      enum irqchip_irq_state which, bool val)
 {
@@ -783,6 +840,12 @@ static u32 do_read_iar(struct pt_regs *regs)
     return iar;
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - gic control handler.
+ *   interrupt가 vector table다음으로 받는 handler.
+ * - vector table -> gic_handle_irq -> irq flow handler
+ */
 static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
 {
     u32 irqnr;
@@ -815,6 +878,22 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs
     }
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - pribits(우선순위 평탄화 bits) 를 가져온다.
+ * - PRIbits, bits [10:8] 
+ *
+ *   ICC_CTLR_EL1.PRIbits         GROUP0, GROUP1      support group1
+ *   (Read only)          pribits single    사용여부  two             사용여부
+ *   0                    1       g.sssssss  X        ssssssss         X
+ *   1                    2       gg.ssssss  X        g.sssssss        X
+ *   2                    3       ggg.sssss  X        gg.ssssss        X
+ *   3                    4       gggg.ssss  O        ggg.sssss        X
+ *   4                    5       ggggg.sss  O        gggg.ssss        O
+ *   5                    6       gggggg.ss  O        ggggg.sss        O
+ *   6                    7       ggggggg.s  O        gggggg.ss        O
+ *   7                    8       gggggggg.  O        ggggggg.s        O
+ */
 static u32 gic_get_pribits(void)
 {
     u32 pribits;
@@ -827,6 +906,10 @@ static u32 gic_get_pribits(void)
     return pribits;
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - pmr에 prbits를 set해보아 kernel이 group0를 다룰수있는지 확인한다.
+ */
 static bool gic_has_group0(void)
 {
     u32 val;
@@ -845,14 +928,64 @@ static bool gic_has_group0(void)
      * becomes 0x80. Reading it back returns 0, indicating that
      * we're don't have access to Group0.
      */
+/*
+ * IAMROOT, 2022.10.08:
+ * - papago
+ *   PMR에서 0이 아닌 가능한 가장 높은 우선 순위를 설정하여 Group0이 EL3의 제어
+ *   하에 있는지 여부를 알아보겠습니다.
+ *
+ *   SCR_EL3.FIQ가 설정되면 CPU 인터페이스가 비트 7을 설정하고 실제 우선 순위를
+ *   비보안 범위로 유지하기 위해 우선 순위가 아래로 이동합니다. 이 과정에서
+ *   최하위 비트가 손실되고 실제 우선 순위는 0x80이 됩니다. 다시 읽으면 0이
+ *   반환되어 Group0에 액세스할 수 없음을 나타냅니다.
+ *
+ * - GIC문서 4.8 Interrupt prioritization 참고
+ *
+ *   ICC_CTLR_EL1.PRIbits         GROUP0, GROUP1      support group1
+ *   (Read only)          pribits single    사용여부  two             사용여부
+ *   0                    1       g.sssssss  X        ssssssss         X
+ *   1                    2       gg.ssssss  X        g.sssssss        X
+ *   2                    3       ggg.sssss  X        gg.ssssss        X
+ *   3                    4       gggg.ssss  O        ggg.sssss        X
+ *   4                    5       ggggg.sss  O        gggg.ssss        O
+ *   5                    6       gggggg.ss  O        ggggg.sss        O
+ *   6                    7       ggggggg.s  O        gggggg.ss        O
+ *   7                    8       gggggggg.  O        ggggggg.s        O
+ *
+ *   - ex) gic_get_pribits == 5, BIT(3)
+ *        
+ *                                GROUP0, GROUP1      support group1
+ *   ICC_CTLR_EL1.PRIbits pribits single              two                     
+ *   4                    5       ggggg.sss           gggg.ssss         
+ *                                    ^                    ^
+ *                                kernel이            kernel이
+ *                                group0를 다를수     group0를 못다루는 상태
+ *                                있는 상태.          set후 값을 읽으면 없다.
+ *                                set후 읽으면
+ *                                값이 있다.
+ */
     gic_write_pmr(BIT(8 - gic_get_pribits()));
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - 값이 다시 읽어지면 single secure state으로 동작하고, 이때는 kernel이
+ *   group0, group1을 다룰수있다.
+ */
     val = gic_read_pmr();
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - 원복
+ */
     gic_write_pmr(old_pmr);
 
     return val != 0;
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - GICD류를 초기값으로 설정한다.
+ */
 static void __init gic_dist_init(void)
 {
     unsigned int i;
@@ -860,8 +993,18 @@ static void __init gic_dist_init(void)
     void __iomem *base = gic_data.dist_base;
     u32 val;
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - disable후 register를 초기화 하고 다시 enable한다.
+ *   GICD_CTLR.DS = 0.
+ */
     /* Disable the distributor */
     writel_relaxed(0, base + GICD_CTLR);
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - disable wait
+ */
     gic_dist_wait_for_rwp();
 
     /*
@@ -870,27 +1013,64 @@ static void __init gic_dist_init(void)
      * do the right thing if the kernel is running in secure mode,
      * but that's not the intended use case anyway.
      */
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - group 개념
+ * - group0 secure
+ *   group1 - non-secure 
+ *          - secure
+ * - all bits set
+ * - 현재 상태(GICD_CTLR.DS==0)
+ *   0b1 When GICD_CTLR.DS==0, the corresponding interrupt is Non-secure Group 1.
+ *   non secure group1로 가게 한다.
+ */
     for (i = 32; i < GIC_LINE_NR; i += 32)
         writel_relaxed(~0, base + GICD_IGROUPR + i / 8);
 
     /* Extended SPI range, not handled by the GICv2/GICv3 common code */
+/*
+ * IAMROOT, 2022.10.08:
+ * - gic espi 까지 전부 disable, inactivate
+ */
     for (i = 0; i < GIC_ESPI_NR; i += 32) {
         writel_relaxed(~0U, base + GICD_ICENABLERnE + i / 8);
         writel_relaxed(~0U, base + GICD_ICACTIVERnE + i / 8);
     }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - 위에 GICD_IGROUPR와 똑같이 설정한다. espi측.
+ */
     for (i = 0; i < GIC_ESPI_NR; i += 32)
         writel_relaxed(~0U, base + GICD_IGROUPRnE + i / 8);
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - level-sensitive로 초기화한다.
+ */
     for (i = 0; i < GIC_ESPI_NR; i += 16)
         writel_relaxed(0, base + GICD_ICFGRnE + i / 4);
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - default interrupt 우선순위를 0xa0(실제는 0xd0)으로 전부 설정한다.
+ */
     for (i = 0; i < GIC_ESPI_NR; i += 4)
         writel_relaxed(GICD_INT_DEF_PRI_X4, base + GICD_IPRIORITYRnE + i);
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - v1, v2 common들도 초기화해준다.
+ */
     /* Now do the common stuff, and wait for the distributor to drain */
     gic_dist_config(base, GIC_LINE_NR, gic_dist_wait_for_rwp);
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - When access is Non-secure, in a system that supports two Security states.
+ *   G1A, G1, ARE_NS enable.
+ */
     val = GICD_CTLR_ARE_NS | GICD_CTLR_ENABLE_G1A | GICD_CTLR_ENABLE_G1;
     if (gic_data.rdists.gicd_typer2 & GICD_TYPER2_nASSGIcap) {
         pr_info("Enabling SGIs without active state\n");
@@ -904,6 +1084,10 @@ static void __init gic_dist_init(void)
      * Set all global interrupts to the boot CPU only. ARE must be
      * enabled.
      */
+/*
+ * IAMROOT, 2022.10.08:
+ * - affinity를 읽어서 gic에 기록한다.
+ */
     affinity = gic_mpidr_to_affinity(cpu_logical_map(smp_processor_id()));
     for (i = 32; i < GIC_LINE_NR; i++)
         gic_write_irouter(affinity, base + GICD_IROUTER + i * 8);
@@ -912,11 +1096,20 @@ static void __init gic_dist_init(void)
         gic_write_irouter(affinity, base + GICD_IROUTERnE + i * 8);
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * @fn giv3의 경우 __gic_update_rdist_properties
+ * - nr_redist_regions수만큼 iterate하며 v3, v4 gic에 대해 fn을 호출한다.
+ */
 static int gic_iterate_rdists(int (*fn)(struct redist_region *, void __iomem *))
 {
     int ret = -ENODEV;
     int i;
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - nr_redist_regions은 일반적으로 numa수와 비슷하다.
+ */
     for (i = 0; i < gic_data.nr_redist_regions; i++) {
         void __iomem *ptr = gic_data.redist_regions[i].redist_base;
         u64 typer;
@@ -935,6 +1128,10 @@ static int gic_iterate_rdists(int (*fn)(struct redist_region *, void __iomem *))
             if (!ret)
                 return 0;
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - single이 아니면 건너뛰면서 last까지 재실행.
+ */
             if (gic_data.redist_regions[i].single_redist)
                 break;
 
@@ -951,6 +1148,11 @@ static int gic_iterate_rdists(int (*fn)(struct redist_region *, void __iomem *))
     return ret ? -ENODEV : 0;
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - 현재 cpu에 해당하는 rdist를 찾아서 현재 cpu에 해당하는
+ *   rdist_rd_base와 phy address를 저장한다.
+ */
 static int __gic_populate_rdist(struct redist_region *region, void __iomem *ptr)
 {
     unsigned long mpidr = cpu_logical_map(smp_processor_id());
@@ -967,6 +1169,10 @@ static int __gic_populate_rdist(struct redist_region *region, void __iomem *ptr)
            MPIDR_AFFINITY_LEVEL(mpidr, 0));
 
     typer = gic_read_typer(ptr + GICR_TYPER);
+/*
+ * IAMROOT, 2022.10.08:
+ * - 현재 cpu인것을 찾는다.
+ */
     if ((typer >> 32) == aff) {
         u64 offset = ptr - region->redist_base;
         raw_spin_lock_init(&gic_data_rdist()->rd_lock);
@@ -977,13 +1183,25 @@ static int __gic_populate_rdist(struct redist_region *region, void __iomem *ptr)
             smp_processor_id(), mpidr,
             (int)(region - gic_data.redist_regions),
             &gic_data_rdist()->phys_base);
+/*
+ * IAMROOT, 2022.10.08:
+ * - 찾은 시점에서 종료.
+ */
         return 0;
     }
 
     /* Try next one */
+/*
+ * IAMROOT, 2022.10.08:
+ * - 못찾았으면 continue
+ */
     return 1;
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - 현재 cpu를 찾아서__gic_populate_rdist()를 설정한다.
+ */
 static int gic_populate_rdist(void)
 {
     if (gic_iterate_rdists(__gic_populate_rdist) == 0)
@@ -996,6 +1214,11 @@ static int gic_populate_rdist(void)
     return -ENODEV;
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - cpu별의 GICR_TYPER를 읽어서 지원하는 feature를 설정한다.
+ *   ppi개수도 여기서 읽어 진다.
+ */
 static int __gic_update_rdist_properties(struct redist_region *region,
                      void __iomem *ptr)
 {
@@ -1021,6 +1244,12 @@ static int __gic_update_rdist_properties(struct redist_region *region,
     return 1;
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - redist_regions 개수 * redist set만큼 iterate하며(cpu개수와 동일) 각각의
+ *   redist register에서 __gic_update_rdist_properties 수행
+ * - 설정된 feature에 대한 정보를 print한다.
+ */
 static void gic_update_rdist_properties(void)
 {
     gic_data.ppi_nr = UINT_MAX;
@@ -1041,6 +1270,10 @@ static inline bool gic_dist_security_disabled(void)
     return readl_relaxed(gic_data.dist_base + GICD_CTLR) & GICD_CTLR_DS;
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - 
+ */
 static void gic_cpu_sys_reg_init(void)
 {
     int i, cpu = smp_processor_id();
@@ -1056,15 +1289,36 @@ static void gic_cpu_sys_reg_init(void)
      *
      * Kindly inform the luser.
      */
+/*
+ * IAMROOT, 2022.10.08:
+ * - papgo
+ *   SRE 비트가 실제로 설정되었는지 확인해야 합니다. 그렇지 않은 경우 SRE가
+ *   EL2에서 비활성화되었음을 의미합니다. 우리는 고통스럽게 죽을 것이고 우리가
+ *   그것에 대해 할 수 있는 것은 아무것도 없습니다.
+ *
+ *   루저에게 알려주세요.
+ */
     if (!gic_enable_sre())
         pr_err("GIC: unable to set SRE (disabled at EL2), panic ahead\n");
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - pribits(우선순위 평탄화 bits) 를 가져온다.
+ */
     pribits = gic_get_pribits();
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - kernel이 group0를 지원하는지.
+ */
     group0 = gic_has_group0();
 
     /* Set priority mask register */
     if (!gic_prio_masking_enabled()) {
+/*
+ * prifri, 2022.10.08:
+ * - masking을 지원안하는경우 pmr을 통해서 막는건 지원안한다.
+ */
         write_gicreg(DEFAULT_PMR_VALUE, ICC_PMR_EL1);
     } else if (gic_supports_nmi()) {
         /*
@@ -1076,6 +1330,17 @@ static void gic_cpu_sys_reg_init(void)
          * and as a result we'll never see this warning in the boot path
          * for that CPU.
          */
+/*
+ * IAMROOT, 2022.10.08:
+ * - papago
+ *   부팅 CPU와 구성이 일치하지 않습니다. 모든 CPU에서 인터럽트 마스킹이 제대로
+ *   작동하지 않기 때문에 시스템이 중단될 가능성이 높습니다. 부팅 CPU는 NMI
+ *   지원을 활성화하기 전에 이 함수를 호출합니다. 따라서 해당 CPU의 부팅 경로에는
+ *   이 경고가 표시되지 않습니다.
+ *
+ * - single secure state일때 group0 & group1 둘다 kernel이 제어한다.
+ *   secure라면 group1만 제어한다.
+ */
         if (static_branch_unlikely(&gic_nonsecure_priorities))
             WARN_ON(!group0 || gic_dist_security_disabled());
         else
@@ -1088,8 +1353,19 @@ static void gic_cpu_sys_reg_init(void)
      * any pre-emptive interrupts from working at all). Writing a zero
      * to BPR restores is reset value.
      */
+/*
+ * IAMROOT, 2022.10.08:
+ * - papago
+ *   일부 펌웨어는 리셋 값에서 변경된 BPR(선점형 인터럽트가 전혀 작동하지 않도록
+ *   충분히 큰 값)과 함께 커널로 전달합니다. BPR 복원에 0을 쓰는 것은 값을
+ *   재설정하는 것입니다.
+ */
     gic_write_bpr1(0);
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - eoimode 1로 할지, mode 0로 할지 결정.
+ */
     if (static_branch_likely(&supports_deactivate_key)) {
         /* EOI drops priority only (mode 1) */
         gic_write_ctlr(ICC_CTLR_EL1_EOImode_drop);
@@ -1099,6 +1375,16 @@ static void gic_cpu_sys_reg_init(void)
     }
 
     /* Always whack Group0 before Group1 */
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - ICC_AP0R<n>_EL1, Interrupt Controller Active Priorities Group 0 Registers
+ * - Group 0 active priorities.
+ * - R0는 무조건
+ *   R1는 6bit이상일때,
+ *   R2, R3는 7bit이상일때.
+ * - ICC_AP0R을 reset한다.
+ */
     if (group0) {
         switch(pribits) {
         case 8:
@@ -1117,6 +1403,10 @@ static void gic_cpu_sys_reg_init(void)
         isb();
     }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - group1에 대한것도 수행한다.
+ */
     switch(pribits) {
     case 8:
     case 7:
@@ -1176,17 +1466,30 @@ static int gic_dist_supports_lpis(void)
         !gicv3_nolpi);
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - 
+ */
 static void gic_cpu_init(void)
 {
     void __iomem *rbase;
     int i;
 
     /* Register ourselves with the rest of the world */
+/*
+ * IAMROOT, 2022.10.08:
+ * - 현재 cpu에 대한 rdist설정이 성공했으면 다음으로 넘어간다.
+ */
     if (gic_populate_rdist())
         return;
 
     gic_enable_redist(true);
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - ppi 16개 초과한다는건 Extend range를 지원하고있다는 의미다.
+ *   그런데 정작 register가 extend range를 지원안하고있으면 말이 안되므로 warning.
+ */
     WARN((gic_data.ppi_nr > 16 || GIC_ESPI_NR != 0) &&
          !(gic_read_ctlr() & ICC_CTLR_EL1_ExtRange),
          "Distributor has extended ranges, but CPU%d doesn't\n",
@@ -1195,6 +1498,10 @@ static void gic_cpu_init(void)
     rbase = gic_data_rdist_sgi_base();
 
     /* Configure SGIs/PPIs as non-secure Group-1 */
+/*
+ * IAMROOT, 2022.10.08:
+ * - non-secure group1로 전부 설정한다.
+ */
     for (i = 0; i < gic_data.ppi_nr + 16; i += 32)
         writel_relaxed(~0, rbase + GICR_IGROUPR0 + i / 8);
 
@@ -1389,6 +1696,10 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val,
 #define gic_smp_init()        do { } while(0)
 #endif
 
+/*
+ * IAMROOT, 2022.10.08:
+ * @return 1. success. 0. fail.
+ */
 static int gic_retrigger(struct irq_data *data)
 {
     return !gic_irq_set_irqchip_state(data, IRQCHIP_STATE_PENDING, true);
@@ -1459,6 +1770,12 @@ static struct irq_chip gic_eoimode1_chip = {
                   IRQCHIP_MASK_ON_SUSPEND,
 };
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - @virq로 @hw를 등록한다. 
+ *   1. chip ops 선택
+ *   2. @hw irq type에따라 flow handler를 설정.
+ */
 static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
                   irq_hw_number_t hw)
 {
@@ -1490,6 +1807,10 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
     case ESPI_RANGE:
         irq_domain_set_info(d, irq, hw, chip, d->host_data,
                     handle_fasteoi_irq, NULL, NULL);
+/*
+ * IAMROOT, 2022.10.08:
+ * - driver용 irq개념이라 probe set.
+ */
         irq_set_probe(irq);
         irqd_set_single_target(irqd);
         break;
@@ -1506,6 +1827,11 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
     }
 
     /* Prevents SW retriggers which mess up the ACK/EOI ordering */
+/*
+ * IAMROOT, 2022.10.08:
+ * - gic는 hw를 지원하기때문에 sw방식은 disable한다.
+ * - irq_sw_resend() 참고
+ */
     irqd_set_handle_enforce_irqctx(irqd);
     return 0;
 }
@@ -1610,7 +1936,7 @@ static int gic_irq_domain_translate(struct irq_domain *d,
 
 /*
  * IAMROOT, 2022.10.01:
- * - @
+ * - @virq 부터 @nr_irqs개 까지 virq를 할당한다.
  */
 static int gic_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
                 unsigned int nr_irqs, void *arg)
@@ -1959,12 +2285,20 @@ static int __init gic_init_bases(void __iomem *dist_base,
     pr_info("Distributor has %sRange Selector support\n",
         gic_data.has_rss ? "" : "no ");
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - MBIS를 지원하면.
+ */
     if (typer & GICD_TYPER_MBIS) {
         err = mbi_init(handle, gic_data.domain);
         if (err)
             pr_err("Failed to initialize MBIs\n");
     }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - gic v3 interrupt handler를 등록한다.
+ */
     set_handle_irq(gic_handle_irq);
 
     gic_update_rdist_properties();
diff --git a/include/linux/irq.h b/include/linux/irq.h
index a456b05de4a2..f2a25fe0db6f 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -332,6 +332,12 @@ static inline bool irqd_is_level_type(struct irq_data *d)
  * Must only be called of irqchip.irq_set_affinity() or low level
  * hierarchy domain allocation functions.
  */
+/*
+ * IAMROOT, 2022.10.08:
+ * - GIC의 경우 SPI, ESPI일때만 set.
+ * - PPI같은 percpu irq인 경우 같은 번호의 irq가 여러 cpu에 가는 개념이라 사용안한다.
+ * - LPI는 무조건 single인 개념(message)이라 따로 설정안한다.
+ */
 static inline void irqd_set_single_target(struct irq_data *d)
 {
     __irqd_to_state(d) |= IRQD_SINGLE_TARGET;
@@ -342,6 +348,11 @@ static inline bool irqd_is_single_target(struct irq_data *d)
     return __irqd_to_state(d) & IRQD_SINGLE_TARGET;
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - hw방법으로 지원을 하므로 sw로 사용하지 말라는것.
+ * - irq_sw_resend 참고
+ */
 static inline void irqd_set_handle_enforce_irqctx(struct irq_data *d)
 {
     __irqd_to_state(d) |= IRQD_HANDLE_ENFORCE_IRQCTX;
@@ -412,6 +423,10 @@ static inline bool irqd_is_activated(struct irq_data *d)
     return __irqd_to_state(d) & IRQD_ACTIVATED;
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - irq_domain_activate_irq
+ */
 static inline void irqd_set_activated(struct irq_data *d)
 {
     __irqd_to_state(d) |= IRQD_ACTIVATED;
@@ -801,6 +816,10 @@ static inline void irq_set_noprobe(unsigned int irq)
     irq_modify_status(irq, 0, IRQ_NOPROBE);
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - driver(SPI, ESPI)의 경우 probe가 됫을경우 set해준다.
+ */
 static inline void irq_set_probe(unsigned int irq)
 {
     irq_modify_status(irq, IRQ_NOPROBE, 0);
diff --git a/include/linux/irqchip/arm-gic-common.h b/include/linux/irqchip/arm-gic-common.h
index 1177f3a1aed5..5be9cf6325f3 100644
--- a/include/linux/irqchip/arm-gic-common.h
+++ b/include/linux/irqchip/arm-gic-common.h
@@ -9,7 +9,22 @@
 
 #include <linux/irqchip/arm-vgic-info.h>
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - default priority.
+ *   일반 interrupt용 우선순위.
+ */
 #define GICD_INT_DEF_PRI        0xa0
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - 0xA0A0A0A0
+ *   실제 들어가는 값은 0xD0D0D0D0
+ *   non-secure에서 동작하는 kernel에서 보는 0xa0값은 기록할때 우측 shift를 하면서
+ *   bit7이 하나더 들어간다. 
+ *   0b1010_0000 - (shift) -> 0b0101_0000 - (bit 7 add) -> 0b1101_0000 == 0xD0
+ *      
+ */
 #define GICD_INT_DEF_PRI_X4        ((GICD_INT_DEF_PRI << 24) |\
                     (GICD_INT_DEF_PRI << 16) |\
                     (GICD_INT_DEF_PRI << 8) |\
diff --git a/include/linux/irqchip/arm-gic-v3.h b/include/linux/irqchip/arm-gic-v3.h
index 96bf0396310f..8128960dc71f 100644
--- a/include/linux/irqchip/arm-gic-v3.h
+++ b/include/linux/irqchip/arm-gic-v3.h
@@ -10,6 +10,10 @@
  * Distributor registers. We assume we're running non-secure, with ARE
  * being set. Secure-only and non-ARE registers are not described.
  */
+/*
+ * IAMROOT, 2022.10.08:
+ * - 
+ */
 #define GICD_CTLR            0x0000
 #define GICD_TYPER            0x0004
 #define GICD_IIDR            0x0008
@@ -19,9 +23,21 @@
 #define GICD_CLRSPI_NSR            0x0048
 #define GICD_SETSPI_SR            0x0050
 #define GICD_CLRSPI_SR            0x0058
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - Interrupt Group Registers,
+ *   Controls whether the corresponding interrupt is in Group 0 or Group 1.
+ *   SPI들이 0번으로 갈지 1번으로 갈지를 설정한다.
+ */
 #define GICD_IGROUPR            0x0080
 #define GICD_ISENABLER            0x0100
 #define GICD_ICENABLER            0x0180
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - set / clear
+ */
 #define GICD_ISPENDR            0x0200
 #define GICD_ICPENDR            0x0280
 #define GICD_ISACTIVER            0x0300
@@ -34,14 +50,38 @@
 #define GICD_ICFGR            0x0C00
 #define GICD_IGRPMODR            0x0D00
 #define GICD_NSACR            0x0E00
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - GICD_IGROUPR<n>E, Interrupt Group Registers (extended SPI range)
+ */
 #define GICD_IGROUPRnE            0x1000
 #define GICD_ISENABLERnE        0x1200
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - Interrupt Clear-Enable Registers
+ */
 #define GICD_ICENABLERnE        0x1400
 #define GICD_ISPENDRnE            0x1600
 #define GICD_ICPENDRnE            0x1800
 #define GICD_ISACTIVERnE        0x1A00
 #define GICD_ICACTIVERnE        0x1C00
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - GICD_IPRIORITYR<n>E, Holds the priority of the corresponding interrupt
+ *   for each extended SPI
+ * - GICD_INT_DEF_PRI_X4값등이 설정된다.
+ */
 #define GICD_IPRIORITYRnE        0x2000
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - GICD_ICFGR<n>E, Interrupt Configuration Registers (Extended SPI Range),
+ *   0b00 Corresponding interrupt is level-sensitive. 
+ *   0b10 Corresponding interrupt is edge-triggered.
+ */
 #define GICD_ICFGRnE            0x3000
 #define GICD_IROUTER            0x6000
 #define GICD_IROUTERnE            0x8000
@@ -66,6 +106,16 @@
  */
 #define GICD_CTLR_RWP            (1U << 31)
 #define GICD_CTLR_nASSGIreq        (1U << 8)
+
+/*
+ * prifri, 2022.10.08:
+ * - GICD_CTLR_DS(Disable Security)
+ *   Disable Security.
+ *   0b0 Non-secure accesses are not permitted to access and modify registers that
+ *   control Group 0 interrupts.
+ *   0b1 Non-secure accesses are permitted to access and modify registers that
+ *   control Group 0 interrupts.
+ */
 #define GICD_CTLR_DS            (1U << 6)
 #define GICD_CTLR_ARE_NS        (1U << 4)
 #define GICD_CTLR_ENABLE_G1A        (1U << 1)
@@ -88,20 +138,63 @@
 #define GICD_CTLR_ENABLE_SS_G1        (1U << 1)
 #define GICD_CTLR_ENABLE_SS_G0        (1U << 0)
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - range selector support
+ *   0b0 The IRI supports targeted SGIs with affinity level 0 values of 0 - 15. 
+ *   0b1 The IRI supports targeted SGIs with affinity level 0 values of 0 - 255.
+ */
 #define GICD_TYPER_RSS            (1U << 26)
+/*
+ * IAMROOT, 2022.10.08:
+ * -0b0 The implementation does not support LPIs.
+ *  0b1 The implementation supports LPIs. 
+ */
 #define GICD_TYPER_LPIS            (1U << 17)
+/*
+ * IAMROOT, 2022.10.08:
+ * - Indicates whether the implementation supports message-based interrupts by
+ *   writing to Distributor registers.
+ *
+ *   0b0 The implementation does not support message-based interrupts by writing to
+ *   Distributor registers.
+ *   The GICD_CLRSPI_NSR, GICD_SETSPI_NSR, GICD_CLRSPI_SR, and GICD_SETSPI_SR
+ *   registers are reserved.
+ *
+ *   0b1 The implementation supports message-based interrupts by writing to the
+ *   GICD_CLRSPI_NSR, GICD_SETSPI_NSR, GICD_CLRSPI_SR, or GICD_SETSPI_SR registers. 
+ */
 #define GICD_TYPER_MBIS            (1U << 16)
+/*
+ * IAMROOT, 2022.10.08:
+ * - Extended SPI.
+ *   0b0 Extended SPI range not implemented.
+ *   0b1 Extended SPI range implemented.
+ */
 #define GICD_TYPER_ESPI            (1U << 8)
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - The number of interrupt identifier bits supported, minus one.
+ */
 #define GICD_TYPER_ID_BITS(typer)    ((((typer) >> 19) & 0x1f) + 1)
+/*
+ * IAMROOT, 2022.10.08:
+ * - lpi 수
+ */
 #define GICD_TYPER_NUM_LPIS(typer)    ((((typer) >> 11) & 0x1f) + 1)
 
 /*
  * IAMROOT, 2022.10.01:
  * - If the value of this field is N, the maximum SPI INTID is 32(N+1) minus 1.
  *   For example, 00011 specifies that the maximum SPI INTID in is 127 
+ * - spi 수
  */
 #define GICD_TYPER_SPIS(typer)        ((((typer) & 0x1f) + 1) * 32)
+/*
+ * IAMROOT, 2022.10.08:
+ * -  espi range
+ */
 #define GICD_TYPER_ESPIS(typer)                        \
     (((typer) & GICD_TYPER_ESPI) ? GICD_TYPER_SPIS((typer) >> 27) : 0)
 
@@ -130,6 +223,14 @@
 #define GICR_IIDR            0x0004
 #define GICR_TYPER            0x0008
 #define GICR_STATUSR            GICD_STATUSR
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - Redistributor Wake Register
+ * - Permits software to control the behavior of the WakeRequest power management
+ *   signal corresponding to the Redistributor. Power management operations follow
+ *   the rules in.
+ */
 #define GICR_WAKER            0x0014
 #define GICR_SETLPIR            0x0040
 #define GICR_CLRLPIR            0x0048
@@ -148,6 +249,26 @@
 
 #define EPPI_BASE_INTID            1056
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - read ppi_nr  0 | 1                | 2  |
+ *   __nr_ppis   16 | 16 + 1 * 32 = 48 | 80 |
+ * - manual
+ *   The value derived from this field specifies the maximum PPI INTID that a
+ *   GIC implementation can support. An implementation might not implement all PPIs
+ *   up to this maximum.
+ *   0b00000 Maximum PPI INTID is 31.
+ *   0b00001 Maximum PPI INTID is 1087.
+ *   0b00010 Maximum PPI INTID is 1119.
+ * - PPI INITID 마지막 ppi id를 의미한다.
+ *
+ * - irq 번호 구성
+ *   | SGI  | PPI  | SPI     | EPPI    | EPPI    |
+ *   0    15 16  31 32   1055 1056 1087 1088 1119
+ *   |16개  | 16개 |  1024개 |   32개  | 32개    | 
+ *           ^0번일때         ^1번일때  ^2번일때
+ *                  0번개수 + 1번개수    0번 개수 + 1번개수 + 2번개수
+ */
 #define GICR_TYPER_NR_PPIS(r)                        \
     ({                                \
         unsigned int __ppinum = ((r) >> 27) & 0x1f;        \
@@ -158,7 +279,28 @@
         __nr_ppis;                        \
      })
 
+/*
+ * IAMROOT, 2022.10.08:
+ * -Indicates whether the Redistributor can assert the WakeRequest signal:
+ *  0b0 This PE is not in, and is not entering, a low power state.
+ *  0b1 The PE is either in, or is in the process of entering, a low power state.
+ *  All interrupts that arrive at the Redistributor: 
+ * - clear : 저전력상태로 안들어가게 한다.
+ */
 #define GICR_WAKER_ProcessorSleep    (1U << 1)
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - Read-only. Indicates whether the connected PE is quiescent:
+ *   0b0 An interface to the connected PE might be active.
+ *   0b1 All interfaces to the connected PE are quiescent.
+ *
+ * - GICR_WAKER_ProcessorSleep 이 set인 경우
+ *   모든 cpu들이 sleep 된 상태가 되면 set된다.
+ *
+ * - GICR_WAKER_ProcessorSleep 이 clear인 경우
+ *   하나의 cpu라도 깨어있는 상태가 되면 clear 된다.
+ */
 #define GICR_WAKER_ChildrenAsleep    (1U << 2)
 
 #define GIC_BASER_CACHE_nCnB        0ULL
@@ -253,6 +395,13 @@
 #define GICR_NSACR            GICD_NSACR
 
 #define GICR_TYPER_PLPIS        (1U << 0)
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - giv v4이후 지원giv v4이후 지원
+ *   The implementation supports virtual LPIs and the direct injection
+ *   of virtual LPIs.
+ */
 #define GICR_TYPER_VLPIS        (1U << 1)
 #define GICR_TYPER_DIRTY        (1U << 2)
 #define GICR_TYPER_DirectLPIS        (1U << 3)
@@ -558,6 +707,11 @@
 /*
  * CPU interface registers
  */
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - ICC_CTLR_EL1, Interrupt Controller Control Register
+ */
 #define ICC_CTLR_EL1_EOImode_SHIFT    (1)
 #define ICC_CTLR_EL1_EOImode_drop_dir    (0U << ICC_CTLR_EL1_EOImode_SHIFT)
 #define ICC_CTLR_EL1_EOImode_drop    (1U << ICC_CTLR_EL1_EOImode_SHIFT)
@@ -566,6 +720,12 @@
 #define ICC_CTLR_EL1_CBPR_MASK        (1 << ICC_CTLR_EL1_CBPR_SHIFT)
 #define ICC_CTLR_EL1_PMHE_SHIFT        6
 #define ICC_CTLR_EL1_PMHE_MASK        (1 << ICC_CTLR_EL1_PMHE_SHIFT)
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - 우선순위 평탄화(leveling). 비슷한 priority끼리는 동일하게 취급한다.
+ *   read 값에서 + 1로 생각한다.(gic_get_pribits() 참고)
+ */
 #define ICC_CTLR_EL1_PRI_BITS_SHIFT    8
 #define ICC_CTLR_EL1_PRI_BITS_MASK    (0x7 << ICC_CTLR_EL1_PRI_BITS_SHIFT)
 #define ICC_CTLR_EL1_ID_BITS_SHIFT    11
@@ -575,6 +735,11 @@
 #define ICC_CTLR_EL1_A3V_SHIFT        15
 #define ICC_CTLR_EL1_A3V_MASK        (0x1 << ICC_CTLR_EL1_A3V_SHIFT)
 #define ICC_CTLR_EL1_RSS        (0x1 << 18)
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - CPU interface INTIDs in the range 1024..8191. ESPI 지원여부
+ */
 #define ICC_CTLR_EL1_ExtRange        (0x1 << 19)
 #define ICC_PMR_EL1_SHIFT        0
 #define ICC_PMR_EL1_MASK        (0xff << ICC_PMR_EL1_SHIFT)
@@ -588,6 +753,16 @@
 #define ICC_IGRPEN1_EL1_MASK        (1 << ICC_IGRPEN1_EL1_SHIFT)
 #define ICC_SRE_EL1_DIB            (1U << 2)
 #define ICC_SRE_EL1_DFB            (1U << 1)
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - 0b0 The memory-mapped interface must be used. Access at EL1 to any ICC_*
+ *   System register other than ICC_SRE_EL1 is trapped to EL1.
+ *   0b1 The System register interface for the current Security state is enabled. 
+ *
+ *   0로 하면 memory에 system register를 mapping해서 사용해야된다는것.. 1로 하면
+ *   msr, mrs의 명령어로 접근가능하다는것.
+ */
 #define ICC_SRE_EL1_SRE            (1U << 0)
 
 /* These are for GICv2 emulation only */
@@ -639,6 +814,12 @@ struct rdists {
     u64            flags;
     u32            gicd_typer;
     u32            gicd_typer2;
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - gic v3이후는 전부 true(gic_init_bases() 참고)로 됬다가 실제 register를
+ *   읽어서 정확히 설정한다(__gic_update_rdist_properties() 참고)
+ */
     bool            has_vlpis;
     bool            has_rvpeid;
     bool            has_direct_lpi;
@@ -652,6 +833,12 @@ int its_init(struct fwnode_handle *handle, struct rdists *rdists,
          struct irq_domain *domain);
 int mbi_init(struct fwnode_handle *fwnode, struct irq_domain *parent);
 
+/*
+ * IAMROOT, 2022.10.08:
+ * @return true. enable성공. false. enable 실패.
+ *
+ * - sre를 enable한다.
+ */
 static inline bool gic_enable_sre(void)
 {
     u32 val;
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h
index 5ee9736f4ae3..b9716dbf9c6a 100644
--- a/include/linux/irqdesc.h
+++ b/include/linux/irqdesc.h
@@ -65,6 +65,13 @@ struct irq_desc {
  */
     struct irq_data        irq_data;
     unsigned int __percpu    *kstat_irqs;
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - gic의 경우
+ *   SGI,PPI,EPPI : handle_percpu_devid_irq
+ *   SPI,ESPI,LPI : handle_fasteoi_irq
+ */
     irq_flow_handler_t    handle_irq;
     struct irqaction    *action;    /* IRQ action list */
     unsigned int        status_use_accessors;
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h
index 3d23be490cdd..9487c1e5916c 100644
--- a/include/linux/irqdomain.h
+++ b/include/linux/irqdomain.h
@@ -73,6 +73,11 @@ struct irq_fwspec {
  */
 enum irq_domain_bus_token {
     DOMAIN_BUS_ANY        = 0,
+/*
+ * IAMROOT, 2022.10.08:
+ * - 일반적인게 DOMAIN_BUS_WIRED(SPI, PPI 방식을 의미한다.).
+ *   나머진 msg기반의 버스방식.
+ */
     DOMAIN_BUS_WIRED,
     DOMAIN_BUS_GENERIC_MSI,
     DOMAIN_BUS_PCI_MSI,
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 735c342ec9b9..f2be3c7459b9 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -87,6 +87,10 @@ EXPORT_SYMBOL(irq_set_irq_type);
  *
  *    Set the hardware irq controller data for an irq
  */
+/*
+ * IAMROOT, 2022.10.08:
+ * - private data를 설정해준다.
+ */
 int irq_set_handler_data(unsigned int irq, void *data)
 {
     unsigned long flags;
@@ -290,7 +294,10 @@ static int __irq_startup(struct irq_desc *desc)
 
 /*
  * IAMROOT, 2022.10.01:
- * - 진행중
+ * - @desc에 해당하는 irq를 startup한다.
+ *   1. 이미 되있다면 enable.
+ *   2. 안되있다면 domain activate 및 affinity를 설정하고 startup 수행.
+ * - @resend가 true이면, pending이 startup전에 되있었다면 irq를 처리해준다.
  */
 int irq_startup(struct irq_desc *desc, bool resend, bool force)
 {
@@ -347,7 +354,8 @@ int irq_activate(struct irq_desc *desc)
 
 /*
  * IAMROOT, 2022.10.01:
- * - 
+ * - irq domain activate 및 irq startup 수행.
+ *   @resend가 true이면 startup전에 irq pending이 들어왔을시 처리해준다.
  */
 int irq_activate_and_startup(struct irq_desc *desc, bool resend)
 {
@@ -1077,6 +1085,11 @@ void handle_percpu_devid_fasteoi_nmi(struct irq_desc *desc)
         chip->irq_eoi(&desc->irq_data);
 }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - irq desc의 flow handler 설정을한다.
+ *   성공했으면 irq startup까지 수행한다.
+ */
 static void
 __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle,
              int is_chained, const char *name)
@@ -1162,7 +1175,7 @@ __irq_do_set_handler(struct irq_desc *desc, irq_flow_handler_t handle,
 
 /*
  * IAMROOT, 2022.10.01:
- * - 
+ * - @handle을 set한다.
  */
 void
 __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
@@ -1586,6 +1599,11 @@ EXPORT_SYMBOL_GPL(irq_chip_set_type_parent);
  * Iterate through the domain hierarchy of the interrupt and check
  * whether a hw retrigger function exists. If yes, invoke it.
  */
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - 상위로 올라가면서 irq_retrigger수행한다.
+ */
 int irq_chip_retrigger_hierarchy(struct irq_data *data)
 {
     for (data = data->parent_data; data; data = data->parent_data)
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
index dba6cc4203c8..8ba3b799acaa 100644
--- a/kernel/irq/handle.c
+++ b/kernel/irq/handle.c
@@ -222,6 +222,12 @@ irqreturn_t handle_irq_event(struct irq_desc *desc)
 }
 
 #ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER
+
+/*
+ * IAMROOT, 2022.10.08:
+ * - 전역 함수에 등록한다. 이미 있으면 busy
+ * - gic의 경우 gic_handle_irq
+ */
 int __init set_handle_irq(void (*handle_irq)(struct pt_regs *))
 {
     if (handle_arch_irq)
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index aefa4775831a..3e8ac8cedab8 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -326,11 +326,19 @@ void irq_domain_remove(struct irq_domain *domain)
 }
 EXPORT_SYMBOL_GPL(irq_domain_remove);
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - @bus_token으로 @domain의 bus_token을 설정하고 debugfs에 등록한다.
+ */
 void irq_domain_update_bus_token(struct irq_domain *domain,
                  enum irq_domain_bus_token bus_token)
 {
     char *name;
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - 이미 @bus_token으로 설정되있다면 return.
+ */
     if (domain->bus_token == bus_token)
         return;
 
@@ -1413,7 +1421,9 @@ EXPORT_SYMBOL_GPL(irq_domain_set_hwirq_and_chip);
  */
 /*
  * IAMROOT, 2022.10.01:
- * - 
+ * - @virq에 대한 @domain을 찾아서 irq_data에 @chip, @chip_datg,
+ *   @hwirq등을 등록하고 @handler, @handler_data등을 설정하고 @virq를
+ *   activate 및 startup을 한다.
  */
 void irq_domain_set_info(struct irq_domain *domain, unsigned int virq,
              irq_hw_number_t hwirq, struct irq_chip *chip,
diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c
index 0c46e9fe3a89..017e5c63ebcd 100644
--- a/kernel/irq/resend.c
+++ b/kernel/irq/resend.c
@@ -27,6 +27,10 @@ static DECLARE_BITMAP(irqs_resend, IRQ_BITMAP_BITS);
 /*
  * Run software resends of IRQ's
  */
+/*
+ * IAMROOT, 2022.10.08:
+ * - irq에 해당하는 handle_irq를 호출한다
+ */
 static void resend_irqs(struct tasklet_struct *unused)
 {
     struct irq_desc *desc;
@@ -47,6 +51,10 @@ static void resend_irqs(struct tasklet_struct *unused)
 /* Tasklet to handle resend: */
 static DECLARE_TASKLET(resend_tasklet, resend_irqs);
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - irq_retrigger등이 구현이 안됬을경우 들어올수있다.
+ */
 static int irq_sw_resend(struct irq_desc *desc)
 {
     unsigned int irq = irq_desc_get_irq(desc);
@@ -55,6 +63,11 @@ static int irq_sw_resend(struct irq_desc *desc)
      * Validate whether this interrupt can be safely injected from
      * non interrupt context
      */
+/*
+ * IAMROOT, 2022.10.08:
+ * - sw 지원 여부를 확인한다.
+ * - gic같은 경우엔 hw방식을 지원하기 때문에 sw 방식은 지원하지 않는다.
+ */
     if (handle_enforce_irqctx(&desc->irq_data))
         return -EINVAL;
 
@@ -86,6 +99,13 @@ static int irq_sw_resend(struct irq_desc *desc)
 }
 #endif
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - @irq_retrigger:    resend an IRQ to the CPU
+ * - resend하기전에 irq_retrigger callback func을 수행한다.
+ * - ex) gic v3의 경우 gic_irq_set_irqchip_state을 통해
+ *   GICD_ISPENDR bit를 set한다.
+ */
 static int try_retrigger(struct irq_desc *desc)
 {
     if (desc->irq_data.chip->irq_retrigger)
@@ -103,6 +123,10 @@ static int try_retrigger(struct irq_desc *desc)
  *
  * Is called with interrupts disabled and desc->lock held.
  */
+/*
+ * IAMROOT, 2022.10.08:
+ * - irq_retrigger를 수행한다. 중복수행 여부, busy check등을 겸한다.
+ */
 int check_irq_resend(struct irq_desc *desc, bool inject)
 {
     int err = 0;
@@ -112,19 +136,38 @@ int check_irq_resend(struct irq_desc *desc, bool inject)
      * are resent by hardware when they are still active. Clear the
      * pending bit so suspend/resume does not get confused.
      */
+/*
+ * IAMROOT, 2022.10.08:
+ * - level type은 안한다.
+ */
     if (irq_settings_is_level(desc)) {
         desc->istate &= ~IRQS_PENDING;
         return -EINVAL;
     }
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - 방금 보냈다면.
+ */
     if (desc->istate & IRQS_REPLAY)
         return -EBUSY;
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - inject가 false인 경우, pending flag를 확인한다.
+ *   inject가 true인 경우엔 pedning flag가 없어도 수행한다.
+ */
     if (!(desc->istate & IRQS_PENDING) && !inject)
         return 0;
 
     desc->istate &= ~IRQS_PENDING;
 
+/*
+ * IAMROOT, 2022.10.08:
+ * - 실패하거나 구현이 안된경우  irq_sw_resend.
+ *   실패조건은 잘못된 irq번호등의 이유가된다.
+ *   아마 보통은 구현이 안됬을때 sw로 resend를 한다는 의미일것이다.
+ */
     if (!try_retrigger(desc))
         err = irq_sw_resend(desc);
 
 

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 스터디 정리 노트 공간입니다. woos 2016.05.14 617
162 [커널 18차] 76-77주차 kkr 2022.11.12 371
161 [커널 19차] 24주차 Min 2022.10.31 107
160 [커널 17차] 112주차 ㅇㅇㅇ 2022.10.30 81
159 [커널 18차] 75주차 kkr 2022.10.29 40
158 [커널 17차] 107 ~ 111주차 ㅇㅇㅇ 2022.10.23 70
157 [커널 19차] 22주차 Min 2022.10.17 76
156 [커널 18차] 73주차 kkr 2022.10.15 38
» [커널 18차] 72주차 kkr 2022.10.09 175
154 [커널 18차] 71주차 kkr 2022.10.01 69
153 [커널 18차] 70주차 kkr 2022.09.24 74
152 [커널 18차] 69주차 kkr 2022.09.22 53
151 [커널 17차] 105~106주차 ㅇㅇㅇ 2022.09.18 50
150 [커널 17차] 104주차 ㅇㅇㅇ 2022.09.04 87
149 [커널 18차] 67주차 kkr 2022.09.03 135
148 [커널 17차] 103주차 ㅇㅇㅇ 2022.08.28 35
147 [커널 18차] 66주차 kkr 2022.08.27 70
146 [커널 17차] 101~102주차 ㅇㅇㅇ 2022.08.21 44
145 [커널 18차] 65주차 kkr 2022.08.20 26
144 [커널 18차] 64주차 kkr 2022.08.13 71
143 [커널 17차] 100주차 [1] ㅇㅇㅇ 2022.08.06 98
XE Login