Skip to content

Commit

Permalink
63rd
Browse files Browse the repository at this point in the history
  • Loading branch information
iamroot12a committed Jul 2, 2016
1 parent f373723 commit 87c384c
Show file tree
Hide file tree
Showing 15 changed files with 456 additions and 0 deletions.
6 changes: 6 additions & 0 deletions arch/arm/include/asm/cacheflush.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@
#include <asm/cachetype.h>
#include <asm/outercache.h>


/* IAMROOT-12AB:
* -------------
* cache aliasing(페이지 컬러링)값은 0 부터 2^alising bit - 1
* (예: 2개의 alising bit를 사용하는 경우 0 ~ 3)
*/
#define CACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT)

/*
Expand Down
39 changes: 39 additions & 0 deletions arch/arm/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -1023,12 +1023,21 @@ static void __init request_standard_resources(const struct machine_desc *mdesc)
struct memblock_region *region;
struct resource *res;

/* IAMROOT-12AB:
* -------------
* 커널 코드와 데이터 영역의 시작과 끝
*/
kernel_code.start = virt_to_phys(_text);
kernel_code.end = virt_to_phys(_etext - 1);
kernel_data.start = virt_to_phys(_sdata);
kernel_data.end = virt_to_phys(_end - 1);

for_each_memblock(memory, region) {

/* IAMROOT-12AB:
* -------------
* System RAM을 iomem_resource에 등록
*/
res = memblock_virt_alloc(sizeof(*res), 0);
res->name = "System RAM";
res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
Expand All @@ -1037,6 +1046,13 @@ static void __init request_standard_resources(const struct machine_desc *mdesc)

request_resource(&iomem_resource, res);


/* IAMROOT-12AB:
* -------------
* RAM에 있는 커널 코드와 데이터 부분을 System RAM의 sub resource로 등록
* (XIP 커널 코드 부분 제외)
*/

if (kernel_code.start >= res->start &&
kernel_code.end <= res->end)
request_resource(res, &kernel_code);
Expand All @@ -1045,6 +1061,11 @@ static void __init request_standard_resources(const struct machine_desc *mdesc)
request_resource(res, &kernel_data);
}


/* IAMROOT-12AB:
* -------------
* Video RAM 영역을 iomem_resource에 추가
*/
if (mdesc->video_start) {
video_ram.start = mdesc->video_start;
video_ram.end = mdesc->video_end;
Expand All @@ -1055,6 +1076,11 @@ static void __init request_standard_resources(const struct machine_desc *mdesc)
* Some machines don't have the possibility of ever
* possessing lp0, lp1 or lp2
*/

/* IAMROOT-12AB:
* -------------
* 머신에 등록된 포트가 있는 경우 ioport_resource에 추가한다.
*/
if (mdesc->reserve_lp0)
request_resource(&ioport_resource, &lp0);
if (mdesc->reserve_lp1)
Expand Down Expand Up @@ -1224,9 +1250,22 @@ void __init setup_arch(char **cmdline_p)
paging_init(mdesc);
request_standard_resources(mdesc);

/* IAMROOT-12AB:
* -------------
* 머신이 제공하는 restart 함수를 등록한다.
* 예) rpi2: bcm2709_restart()
*/
if (mdesc->restart)
arm_pm_restart = mdesc->restart;

/* IAMROOT-12AB:
* -------------
* dtb를 unflatten한 후 메모리를 할당받아 구조체 형태로 변환한다.
*
* 전역 of_aliases, of_chosen, of_stdout 노드를 찾고,
* 전역 aliases_lookup 리스트에 aliases 노드의 모든 속성값으로 찾은 노드들을
* alias_prop 구조체 + stem[] 형태로 변환하여 추가한다.
*/
unflatten_device_tree();

arm_dt_init_cpu_maps();
Expand Down
9 changes: 9 additions & 0 deletions arch/arm/mm/cache-v7.S
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,10 @@ ENDPROC(v7_coherent_user_range)
* - size - region size
*/
ENTRY(v7_flush_kern_dcache_area)
/* IAMROOT-12AB:
* -------------
* r2에 d-cache의 cache line 바이트를 담아온다.
*/
dcache_line_size r2, r3
add r1, r0, r1
sub r3, r2, #1
Expand All @@ -384,6 +388,11 @@ ENTRY(v7_flush_kern_dcache_area)
ALT_SMP(W(dsb))
ALT_UP(W(nop))
#endif

/* IAMROOT-12AB:
* -------------
* 캐시 라인 바이트 수 단위씩 증가 시키며 루프를 돌며 d-cache를 clean & invalidate한다.
*/
1:
mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line / unified line
add r0, r0, r2
Expand Down
36 changes: 36 additions & 0 deletions arch/arm/mm/flush.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@

#ifdef CONFIG_CPU_CACHE_VIPT

/* IAMROOT-12AB:
* -------------
* ARMv6 이하의 VIPT cache aliasing을 사용하는 아키텍처에서는 이 함수를 사용한다.
* (예: 캐시 단면적이 16K인 경우 페이지 사이즈 4K 보다 4배 더 크다.
* 이러한 경우 0 ~ 3개의 캐시 컬러를 갖는 페이지가 발생하고 그 페이지들을
* 플러시 할 때 사용한다.)
* rpi2: 사용하지 않는다.
*/
static void flush_pfn_alias(unsigned long pfn, unsigned long vaddr)
{
unsigned long to = FLUSH_ALIAS_START + (CACHE_COLOUR(vaddr) << PAGE_SHIFT);
Expand Down Expand Up @@ -192,18 +200,40 @@ void __flush_dcache_page(struct address_space *mapping, struct page *page)
* coherent with the kernels mapping.
*/
if (!PageHighMem(page)) {

/* IAMROOT-12AB:
* -------------
* byte로 변환된 페이지 사이즈
*/
size_t page_size = PAGE_SIZE << compound_order(page);
__cpuc_flush_dcache_area(page_address(page), page_size);
} else {
unsigned long i;
if (cache_is_vipt_nonaliasing()) {

/* IAMROOT-12AB:
* -------------
* compound의 각 페이지에 대해 루프를 돌며
*/
for (i = 0; i < (1 << compound_order(page)); i++) {

/* IAMROOT-12AB:
* -------------
* fixmap을 이용하여 highmem 페이지를 매핑하고 캐시 clean & invalidate 후
* 다시 언매핑한다.
*/
void *addr = kmap_atomic(page + i);
__cpuc_flush_dcache_area(addr, PAGE_SIZE);
kunmap_atomic(addr);
}
} else {
for (i = 0; i < (1 << compound_order(page)); i++) {

/* IAMROOT-12AB:
* -------------
* kmap을 이용하여 highmem 페이지를 매핑하고 캐시 clean & invalidate 후
* 다시 언매핑한다.
*/
void *addr = kmap_high_get(page + i);
if (addr) {
__cpuc_flush_dcache_area(addr, PAGE_SIZE);
Expand All @@ -218,6 +248,12 @@ void __flush_dcache_page(struct address_space *mapping, struct page *page)
* we only need to do one flush - which would be at the relevant
* userspace colour, which is congruent with page->index.
*/

/* IAMROOT-12AB:
* -------------
* maping이 true이고 VIPT aliasing을 사용하는 데이터 캐시의 경우 아래 루틴을 사용한다.
* ARMv7: 데이터 캐시에 PIPT를 사용한다.
*/
if (mapping && cache_is_vipt_aliasing())
flush_pfn_alias(page_to_pfn(page),
page->index << PAGE_CACHE_SHIFT);
Expand Down
4 changes: 4 additions & 0 deletions arch/arm/mm/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1974,6 +1974,10 @@ void __init paging_init(const struct machine_desc *mdesc)
*/
bootmem_init();

/* IAMROOT-12AB:
* -------------
* zoro 초기화된 1개의 페이지 가상주소를 전역 변수에 대입한다.
*/
empty_zero_page = virt_to_page(zero_page);
__flush_dcache_page(NULL, empty_zero_page);
}
66 changes: 66 additions & 0 deletions drivers/of/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,15 @@ LIST_HEAD(aliases_lookup);

struct device_node *of_root;
EXPORT_SYMBOL(of_root);

/* IAMROOT-12AB:
* -------------
* of_chosen: chosen 노드를 가리킨다.
* of_aliases: aliases 노드를 가리킨다.
* of_stdout: 기본 출력을 담당하는 디바이스 노드를 가리킨다.
* of_stdout_options:
*/

struct device_node *of_chosen;
struct device_node *of_aliases;
struct device_node *of_stdout;
Expand Down Expand Up @@ -1857,6 +1866,12 @@ static void of_alias_add(struct alias_prop *ap, struct device_node *np,
ap->id = id;
strncpy(ap->stem, stem, stem_len);
ap->stem[stem_len] = 0;

/* IAMROOT-12AB:
* -------------
* 전역 aliases_lookup에 alias_prop 객체를 추가한다.
*/

list_add_tail(&ap->link, &aliases_lookup);
pr_debug("adding DT alias:%s: stem=%s id=%i node=%s\n",
ap->alias, ap->stem, ap->id, of_node_full_name(np));
Expand All @@ -1876,11 +1891,34 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
{
struct property *pp;

/* IAMROOT-12AB:
* -------------
* of_aliases에 /aliases 노드를 찾아서 대입한다.
* of_chosen에 /chosen 노드를 찾아서 대입한다.
*/
of_aliases = of_find_node_by_path("/aliases");
of_chosen = of_find_node_by_path("/chosen");
if (of_chosen == NULL)
of_chosen = of_find_node_by_path("/chosen@0");


/* IAMROOT-12AB:
* -------------
* chosen 노드의 stdout-path 속성 값으로 노드를 찾아서 전역 of_stdout에 대입한다.
*
* 예)
* chosen {
* stdout-path = &uart1;
* };
*
* &uart1 {
* pinctrl-names = "default";
* pinctrl-0 = <&pinctrl_uart1>;
* fsl,uart-has-rtscts;
* status = "okay";
* };
*/

if (of_chosen) {
/* linux,stdout-path and /aliases/stdout are for legacy compatibility */
const char *name = of_get_property(of_chosen, "stdout-path", NULL);
Expand All @@ -1903,17 +1941,34 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
int id, len;

/* Skip those we do not want to proceed */

/* IAMROOT-12AB:
* -------------
* aliases 노드에서 name과 phandle 속성은 제외한다.
*/
if (!strcmp(pp->name, "name") ||
!strcmp(pp->name, "phandle") ||
!strcmp(pp->name, "linux,phandle"))
continue;

/* IAMROOT-12AB:
* -------------
* 각 속성값으로 노드를 찾아온다.
*/
np = of_find_node_by_path(pp->value);
if (!np)
continue;

/* walk the alias backwards to extract the id and work out
* the 'stem' string */

/* IAMROOT-12AB:
* -------------
* stem 문자열은 뒷부분의 숫자를 제외하고 골뱅이를 포함한 노드명이다.
* 예) abc@1000
* stem[] -> abc@
*/

while (isdigit(*(end-1)) && end > start)
end--;
len = end - start;
Expand All @@ -1922,11 +1977,22 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
continue;

/* Allocate an alias_prop with enough space for the stem */

/* IAMROOT-12AB:
* -------------
* alias_prop 구조체 + stem[]을 할당한다.
* ap->alias에 속성값 주소를 대입한다.
*/
ap = dt_alloc(sizeof(*ap) + len + 1, 4);
if (!ap)
continue;
memset(ap, 0, sizeof(*ap) + len + 1);
ap->alias = start;

/* IAMROOT-12AB:
* -------------
* 전역 aliases_lookup에 alias_prop 구조체 + stem[]을 추가한다.
*/
of_alias_add(ap, np, id, start, len);
}
}
Expand Down
Loading

0 comments on commit 87c384c

Please sign in to comment.