18c99dfedSAndrew Turner /*-
28c99dfedSAndrew Turner * Copyright (c) 2021 The FreeBSD Foundation
38c99dfedSAndrew Turner * All rights reserved.
48c99dfedSAndrew Turner *
58c99dfedSAndrew Turner * This software was developed by Andrew Turner under
68c99dfedSAndrew Turner * sponsorship from the FreeBSD Foundation.
78c99dfedSAndrew Turner *
88c99dfedSAndrew Turner * Redistribution and use in source and binary forms, with or without
98c99dfedSAndrew Turner * modification, are permitted provided that the following conditions
108c99dfedSAndrew Turner * are met:
118c99dfedSAndrew Turner * 1. Redistributions of source code must retain the above copyright
128c99dfedSAndrew Turner * notice, this list of conditions and the following disclaimer.
138c99dfedSAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright
148c99dfedSAndrew Turner * notice, this list of conditions and the following disclaimer in the
158c99dfedSAndrew Turner * documentation and/or other materials provided with the distribution.
168c99dfedSAndrew Turner *
178c99dfedSAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
188c99dfedSAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
198c99dfedSAndrew Turner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
208c99dfedSAndrew Turner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
218c99dfedSAndrew Turner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
228c99dfedSAndrew Turner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
238c99dfedSAndrew Turner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
248c99dfedSAndrew Turner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
258c99dfedSAndrew Turner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
268c99dfedSAndrew Turner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
278c99dfedSAndrew Turner * SUCH DAMAGE.
288c99dfedSAndrew Turner */
298c99dfedSAndrew Turner
308c99dfedSAndrew Turner #include <sys/param.h>
318c99dfedSAndrew Turner #include <sys/physmem.h>
328c99dfedSAndrew Turner
338c99dfedSAndrew Turner #include <atf-c.h>
348c99dfedSAndrew Turner
358c99dfedSAndrew Turner ATF_TC_WITHOUT_HEAD(hwregion);
ATF_TC_BODY(hwregion,tc)368c99dfedSAndrew Turner ATF_TC_BODY(hwregion, tc)
378c99dfedSAndrew Turner {
388c99dfedSAndrew Turner vm_paddr_t avail[4];
398c99dfedSAndrew Turner size_t len;
408c99dfedSAndrew Turner
418c99dfedSAndrew Turner physmem_hardware_region(2 * PAGE_SIZE, PAGE_SIZE);
428c99dfedSAndrew Turner
438c99dfedSAndrew Turner len = physmem_avail(avail, 4);
448c99dfedSAndrew Turner ATF_CHECK_EQ(len, 2);
458c99dfedSAndrew Turner ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
468c99dfedSAndrew Turner ATF_CHECK_EQ(avail[1], 3 * PAGE_SIZE);
478c99dfedSAndrew Turner
488c99dfedSAndrew Turner /* Add an overlap */
498c99dfedSAndrew Turner physmem_hardware_region(2 * PAGE_SIZE, 2 * PAGE_SIZE);
508c99dfedSAndrew Turner len = physmem_avail(avail, 4);
518c99dfedSAndrew Turner ATF_CHECK_EQ(len, 2);
528c99dfedSAndrew Turner ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
538c99dfedSAndrew Turner ATF_CHECK_EQ(avail[1], 4 * PAGE_SIZE);
548c99dfedSAndrew Turner
558c99dfedSAndrew Turner /* Add a touching region */
568c99dfedSAndrew Turner physmem_hardware_region(4 * PAGE_SIZE, PAGE_SIZE);
578c99dfedSAndrew Turner len = physmem_avail(avail, 4);
588c99dfedSAndrew Turner ATF_CHECK_EQ(len, 2);
598c99dfedSAndrew Turner ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
608c99dfedSAndrew Turner ATF_CHECK_EQ(avail[1], 5 * PAGE_SIZE);
618c99dfedSAndrew Turner
628c99dfedSAndrew Turner /* Add a partial overlap */
638c99dfedSAndrew Turner physmem_hardware_region(4 * PAGE_SIZE, 2 * PAGE_SIZE);
648c99dfedSAndrew Turner len = physmem_avail(avail, 4);
658c99dfedSAndrew Turner ATF_CHECK_EQ(len, 2);
668c99dfedSAndrew Turner ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
678c99dfedSAndrew Turner ATF_CHECK_EQ(avail[1], 6 * PAGE_SIZE);
688c99dfedSAndrew Turner
698c99dfedSAndrew Turner /* Add a non-page aligned section */
708c99dfedSAndrew Turner physmem_hardware_region(6 * PAGE_SIZE, PAGE_SIZE / 2);
718c99dfedSAndrew Turner len = physmem_avail(avail, 4);
728c99dfedSAndrew Turner ATF_CHECK_EQ(len, 2);
738c99dfedSAndrew Turner ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
748c99dfedSAndrew Turner ATF_CHECK_EQ(avail[1], 6 * PAGE_SIZE);
758c99dfedSAndrew Turner
768c99dfedSAndrew Turner /* Add the remaining part of the page */
778c99dfedSAndrew Turner physmem_hardware_region(6 * PAGE_SIZE + PAGE_SIZE / 2, PAGE_SIZE / 2);
788c99dfedSAndrew Turner len = physmem_avail(avail, 4);
798c99dfedSAndrew Turner ATF_CHECK_EQ(len, 2);
808c99dfedSAndrew Turner ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
818c99dfedSAndrew Turner ATF_CHECK_EQ(avail[1], 7 * PAGE_SIZE);
828c99dfedSAndrew Turner }
838c99dfedSAndrew Turner
848c99dfedSAndrew Turner ATF_TC_WITHOUT_HEAD(hwregion_exclude);
ATF_TC_BODY(hwregion_exclude,tc)858c99dfedSAndrew Turner ATF_TC_BODY(hwregion_exclude, tc)
868c99dfedSAndrew Turner {
878c99dfedSAndrew Turner vm_paddr_t avail[6];
888c99dfedSAndrew Turner size_t len;
898c99dfedSAndrew Turner
908c99dfedSAndrew Turner physmem_hardware_region(2 * PAGE_SIZE, 5 * PAGE_SIZE);
918c99dfedSAndrew Turner physmem_exclude_region(4 * PAGE_SIZE, PAGE_SIZE, EXFLAG_NOALLOC);
928c99dfedSAndrew Turner
938c99dfedSAndrew Turner len = physmem_avail(avail, 6);
948c99dfedSAndrew Turner ATF_CHECK_EQ(len, 4);
958c99dfedSAndrew Turner ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
968c99dfedSAndrew Turner ATF_CHECK_EQ(avail[1], 4 * PAGE_SIZE);
978c99dfedSAndrew Turner ATF_CHECK_EQ(avail[2], 5 * PAGE_SIZE);
988c99dfedSAndrew Turner ATF_CHECK_EQ(avail[3], 7 * PAGE_SIZE);
998c99dfedSAndrew Turner
1008c99dfedSAndrew Turner /* Check mis-aligned/sized excluded regions work */
1018c99dfedSAndrew Turner physmem_exclude_region(4 * PAGE_SIZE - 1, PAGE_SIZE + 2,
1028c99dfedSAndrew Turner EXFLAG_NOALLOC);
1038c99dfedSAndrew Turner len = physmem_avail(avail, 6);
1048c99dfedSAndrew Turner ATF_CHECK_EQ(len, 4);
1058c99dfedSAndrew Turner ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
1068c99dfedSAndrew Turner ATF_CHECK_EQ(avail[1], 3 * PAGE_SIZE);
1078c99dfedSAndrew Turner ATF_CHECK_EQ(avail[2], 6 * PAGE_SIZE);
1088c99dfedSAndrew Turner ATF_CHECK_EQ(avail[3], 7 * PAGE_SIZE);
1098c99dfedSAndrew Turner }
1108c99dfedSAndrew Turner
111*d8bff5b6SAndrew Turner ATF_TC_WITHOUT_HEAD(hwregion_unordered);
ATF_TC_BODY(hwregion_unordered,tc)112*d8bff5b6SAndrew Turner ATF_TC_BODY(hwregion_unordered, tc)
113*d8bff5b6SAndrew Turner {
114*d8bff5b6SAndrew Turner vm_paddr_t avail[4];
115*d8bff5b6SAndrew Turner size_t len;
116*d8bff5b6SAndrew Turner
117*d8bff5b6SAndrew Turner /* Add a partial page */
118*d8bff5b6SAndrew Turner physmem_hardware_region(PAGE_SIZE, PAGE_SIZE / 2);
119*d8bff5b6SAndrew Turner /* Add a full page not touching the previous */
120*d8bff5b6SAndrew Turner physmem_hardware_region( 2 * PAGE_SIZE, PAGE_SIZE);
121*d8bff5b6SAndrew Turner /* Add the remainder of the first page */
122*d8bff5b6SAndrew Turner physmem_hardware_region(PAGE_SIZE + PAGE_SIZE / 2, PAGE_SIZE / 2);
123*d8bff5b6SAndrew Turner
124*d8bff5b6SAndrew Turner len = physmem_avail(avail, 4);
125*d8bff5b6SAndrew Turner ATF_CHECK_EQ(len, 2);
126*d8bff5b6SAndrew Turner ATF_CHECK_EQ(avail[0], PAGE_SIZE);
127*d8bff5b6SAndrew Turner ATF_CHECK_EQ(avail[1], 3 * PAGE_SIZE);
128*d8bff5b6SAndrew Turner }
129*d8bff5b6SAndrew Turner
ATF_TP_ADD_TCS(tp)1308c99dfedSAndrew Turner ATF_TP_ADD_TCS(tp)
1318c99dfedSAndrew Turner {
1328c99dfedSAndrew Turner
1338c99dfedSAndrew Turner ATF_TP_ADD_TC(tp, hwregion);
1348c99dfedSAndrew Turner ATF_TP_ADD_TC(tp, hwregion_exclude);
135*d8bff5b6SAndrew Turner ATF_TP_ADD_TC(tp, hwregion_unordered);
1368c99dfedSAndrew Turner return (atf_no_error());
1378c99dfedSAndrew Turner }
138